;SOURCEBEG

; ==========================================================================
;
; Name:   Nutz_Mickey                                  Micheal Bttner
; Date:   21.2.1994                                    Am Rinkenbhl 146
; System: Sega Megadrive                               64807 Dieburg
; Target: Endgegner fr Nutz                           Tel.: 06071/24469
;
; ==========================================================================

		IFD	Flag_project
Flag_Mickey	Set	1
		ENDC
		IFND	Flag_Mickey
Flag_Mickey	Set	0
		ENDC
		IFEQ	Flag_Mickey
Flag_Mickey	Set	1
		Include	/Nutz_project
		ELSEIF

; ==========================================================================
;
; Definitionen
;
; ==========================================================================

SIGEL		MACRO
		dc.w	\1<<8,\2
		dc.b	\3,\4
		ENDM

; ==========================================================================

		rsset	(Mickey_Global_VRam-Tekkno_EnemyVRam)>>5
TILES_FIRE1	rs.b	16
TILES_FIRE2	rs.b	16
TILES_FIRE3	rs.b	16
TILES_FIRE4	rs.b	16
TILES_FIRE5	rs.b	16
TILES_FIRE6	rs.b	16
TILES_FIRE7	rs.b	16
TILES_FIRE8	rs.b	16
TILES_EXPL1	rs.b	16
TILES_EXPL2	rs.b	16
TILES_EXPL3	rs.b	16
TILES_EXPL4	rs.b	16
TILES_EXPL5	rs.b	16
TILES_GLOBAL_SIZEOF	rs.b	0

; ==========================================================================

		rsreset
TILES_GUMMI1	rs.b	4*4
TILES_GUMMI2	rs.b	4*3
TILES_GUMMI3	rs.b	4*4
TILES_GUMMI4	rs.b	4*3
TILES_HAND	rs.b	2*4
TILES_RING	rs.b	2*2
TILES_DOOR2	rs.b	2*4
TILES_DOOR1	rs.b	2*4
TILES_BUTTON	rs.b	4*2
TILES_GUMMI_SIZEOF	rs.b	0

; ==========================================================================

		rsreset
TILES_JUMP1	rs.b	2*3
TILES_JUMP2	rs.b	2*3
TILES_JUMP3	rs.b	4*3
TILES_JUMP4	rs.b	4*4
TILES_JUMP5	rs.b	4*2
TILES_JUMP6	rs.b	4*2
TILES_JUMP7	rs.b	2*2
TILES_STACHEL1	rs.b	4*3
TILES_STACHEL2	rs.b	2*2
TILES_KLAPPE_L	rs.b	3*3
TILES_KLAPPE_M	rs.b	3*2
TILES_BEIN_L	rs.b	4*4
TILES_BEIN_M	rs.b	4*4
TILES_BUMPER1	rs.b	4*3
TILES_BUMPER2	rs.b	4*2
TILES_JUMP_SIZEOF	rs.b	0

; ==========================================================================

		rsreset
TILES_WATER_MAIN	rs.b	166
TILES_WATER_MINE	rs.b	4*4
TILES_WATER_FISCH	rs.b	4*4*4
TILES_WATER_MOVER	rs.b	4*2
TILES_WATER_FONTNE	rs.b	4*4*2+4*1*4
TILES_WATER_BUBBLE1	rs.b	2*2
TILES_WATER_BUBBLE2	rs.b	2*2
TILES_WATER_BUMPER1	rs.b	4*3
TILES_WATER_BUMPER2	rs.b	4*2
TILES_WATER_SIZEOF	rs.b	0

; ==========================================================================

			rsreset
TILES_LEMMING_01		rs.b	3*4
TILES_LEMMING_02		rs.b	4*4
TILES_LEMMING_03		rs.b	4*4
TILES_LEMMING_04		rs.b	4*4
TILES_LEMMING_05		rs.b	4*4
TILES_LEMMING_06		rs.b	4*4
TILES_LEMMING_07		rs.b	3*2
TILES_LEMMING_08		rs.b	4*4
TILES_LEMMING_09		rs.b	4*4
TILES_LEMMING_10		rs.b	4*4
TILES_LEMMING_11		rs.b	4*4
TILES_LEMMING_12		rs.b	3*2
TILES_LEMMING_13		rs.b	2*3
TILES_LEMMING_14		rs.b	2*3
TILES_LEMMING_VALS		rs.b	10
TILES_LEMMING_HUHN		rs.b	4*4
TILES_LEMMING_FOOT1		rs.b	2*1
TILES_LEMMING_FOOT2		rs.b	2*1
TILES_LEMMING_BUMPER1	rs.b	4*3
TILES_LEMMING_BUMPER2	rs.b	4*2
TILES_LEMMING_SIZEOF	rs.b	0

; ==========================================================================

HITS_JUMPER	EQU	5
HITS_GUMMI	EQU	7
HITS_WATER	EQU	8
HITS_LEMMING	EQU	8

; ==========================================================================

NUM_GEGNER	EQU	64
NUM_BUTTON1	EQU	65
NUM_BUTTON2	EQU	66
NUM_BUTTON3	EQU	67
NUM_DOOR		EQU	68

; ==========================================================================

NUM_GEGNER1	EQU	64
NUM_BUMPER1	EQU	65

; ==========================================================================

NUM_GEGNER4	EQU	64
NUM_Lemming	EQU	65
NUM_M_Huhn	EQU	66
NUM_EBUMPER	EQU	67
NUM_EEXPLO	EQU	68

; ==========================================================================

		rsreset
Jump_Timer	rs.w	1
Jump_Task		rs.w	1
Jump_Level	rs.w	1
Jump_Offset	rs.w	1
Jump_Move_Pos	rs.w	1
Jump_Move_Flag	rs.w	1
Jump_Move_Timer	rs.w	1
Jump_Move_Offset	rs.w	1
Jump_X_Position	rs.w	1
Jump_Y_Position	rs.w	1
Jump_X_Speed	rs.w	1
Jump_Y_Speed	rs.w	1
Jump_X_Acc	rs.w	1
Jump_Y_Acc	rs.w	1
Jump_X_Float	rs.w	1
Jump_Y_Float	rs.w	1
Jump_Gravitation	rs.w	1
Jump_Auto_Timer	rs.w	1
Jump_Auto_Flag	rs.w	1
Jump_Auto_Height	rs.w	1
Jump_Moving_Flag	rs.w	1
Jump_Moving_Source	rs.w	1
Jump_Moving_Target	rs.w	1
Jump_Moving_Acc	rs.w	1
Jump_Hit_Possible	rs.w	1
Jump_Hit_Zhler	rs.w	1
Jump_Hit_Timer	rs.w	1
Jump_Boost_Flag	rs.w	1
Jump_Boost_Offset	rs.w	1
Jump_Boost_Timer	rs.w	1
Jump_Exit_Timer	rs.w	1
Jump_Jump_Flag	rs.w	1
Jump_Flame_Flag	rs.w	1
Jump_Flame_Force	rs.w	1
Jump_Flame_Timer	rs.w	1
Jump_Stachel_PosI	rs.w	1
Jump_Stachel_PosS	rs.w	1
Jump_Stack	rs.w	6
Jump_Flame_Zeiger	rs.l	1
Jump_Stack_Zeiger	rs.l	1
Jump_Task_Zeiger	rs.l	1
Jump_Boost_Zeiger	rs.l	1
JUMP_SIZEOF	rs.w	0

; ==========================================================================

FLAME_MAX		EQU	6
STACK_SIZE	EQU	6*WORD

; ==========================================================================

		rsreset
Flame_X_Position	rs.w	1
Flame_Y_Position	rs.w	1
Flame_Timer	rs.w	1
Flame_Used	rs.w	1
Flame_Frame	rs.w	1
Flame_Anim	rs.w	1
Flame_Speed	rs.w	1
Flame_Float	rs.w	1
FLAME_SIZEOF	rs.w	0

; ==========================================================================

		rsset	$FFE000
Jump_Struktur	rs.b	JUMP_SIZEOF
Flame1_Struktur	rs.b	FLAME_SIZEOF*FLAME_MAX
VARIABLEN1_SIZEOF	rs.w	0

; ==========================================================================
TASK_FALL		EQU	0	;Wartet, bis der Gegner auf dem
				;Boden sitzt.
; ==========================================================================
TASK_WAIT		EQU	1	;Wartet die angegbene Anzahl
				;der Frames (Vorzeichenlos).
; ==========================================================================
TASK_GOTO		EQU	2	;Der Gegner steuert die
				;Hydraulik an. Parameter definiert
				;die Hhe.
				;LEVEL_MIN = Beine einfahren
				;LEVEL_MAX = Beine ausfahren
; ==========================================================================
TASK_BRANCH	EQU	3	;Das Programm des Gegners verzweigt
				;bedingungslos. Vorzeichenbehafteter
				;Parameter definiert die Anzahl zu
				;berspringender Bytes
; ==========================================================================
TASK_TABLE	EQU	4	;Die Hydraulik kann ber eine
				;Tabelle gestuert werden. Der
				;Erste Parameter definiert die
				;Nummer der Tabelle, der zweite
				;die Anzahl der Durchlufe.
; ==========================================================================
TASK_FIRE		EQU	5	;Der Antrieb des Gegners kann
				;an- bzw. ausgeschaltet werden.
				;Parameter definert den Zustand.
				;FIRE_ON  = +1
				;FIRE_OFF = -1
; ==========================================================================
TASK_ACC		EQU	6	;Gegner kann beschleunigen.
				;Parameter definiert den Wert
				;der Beschleunigung (Sollte
				;negativ sein, da Gravitation
				;(48) positiv ist).
; ==========================================================================
TASK_AUTO		EQU	7	;Der Gegner schaltet seinen
				;Autopiloten ein oder aus.
				;Parameter definiert die Hhe,
				;auf der der Pilot den Gegner
				;hlt. Eine Hhe von NULL schatet
				;den Piloten aus.
; ==========================================================================
TASK_MOVE		EQU	8	;Der Gegner bewegt sich nach
				;links oder rechts. Der erste
				;Parameter definiert die
				;Beschleunigung, der zweite
				;die Anzahl der 16'er Plttchen,
				;die zu berwinden sind.
				;Die Beschleunigung sollte immer
				;positiv sein. Die Anzahl der
				;Pltchen wird allerdings
				;vorzeichenrichtig behandelt.
; ==========================================================================
TASK_GOSUB	EQU	9	;Das Programm des Gegners verzweigt
				;bedingungslos. Vorzeichenbehafteter
				;Parameter definiert die Anzahl zu
				;berspringender Bytes.
				;Ein 'TASK_RETURN' setzt das
				;Programm hinter dem aufrufenden
				;'TASK_GOSUB' fort.
; ==========================================================================
TASK_RETURN	EQU	10	;Ein 'TASK_RETURN' setzt das
				;Programm hinter dem aufrufenden
				;'TASK_GOSUB' fort.
				;(siehe 'TASK_GOSUB')
; ==========================================================================
TASK_JUMP		EQU	11	;Der Gegner springt mit der
				;Geschwidigkeit, die der
				;vorzeichenbehaftete Parameter
				;definiert.
; ==========================================================================
TASK_WAITMOVE	EQU	12	;Wartet bis der Gegner die
				;aktuelle horizonale Bewegung
				;abgeschlossen hat.
; ==========================================================================
TASK_POSSIBLE	EQU	13	;Setzt das Flag, das es Nutz
				;ermglicht den Gegner zu treffen.
				;Parameter = 1 : Enable
				;Parameter = 0 : Disable

; ==========================================================================

LEVEL_MIN		EQU	55
LEVEL_MAX		EQU	72

; ==========================================================================

BESCHLEUNIGUNG_HIN	EQU	12
BESCHLEUNIGUNG_WEG	EQU	20

; ==========================================================================

LIANE_FIX		EQU	-1
LIANE_ENDE	EQU	0
LIANE_NORMAL	EQU	1

; ==========================================================================

			rsreset
Liane_X_Position		rs.w	1
Liane_Y_Position		rs.w	1
Liane_X_Offset		rs.w	1
Liane_Y_Offset		rs.w	1
Liane_X_Beschleunigung	rs.w	1
Liane_Y_Beschleunigung	rs.w	1
Liane_X_Geschwindigkeit	rs.w	1
Liane_Y_Geschwindigkeit	rs.w	1
Liane_X_Float		rs.w	1
Liane_Y_Float		rs.w	1
Liane_X_Gravitation		rs.w	1
Liane_Y_Gravitation_Ist	rs.w	1
Liane_Y_Gravitation_Soll	rs.w	1
Liane_Begrenzung		rs.w	1
LIANE_ENTRY_LENGTH		rs.w	0

; ==========================================================================
;
; Der erste Punkt der Liane mu ein Fixpunkt (LIANE_FIX) sein. Wenn die
; Liane einfach als Seil nach unten hngen soll, werden die restlichen
; Punkte als normal (LIANE_NORMAL) definiert. Der letzte Eintrag in der
; Struktur sollte leer und als Endpunkt (LIANE_ENDE) definiert sein.
; Sollen weitere Fixpunkte existieren, knnen die normalen Punkte als
; Fixpunkte definiert werden.
;
; ==========================================================================

		rsreset
Gummi_Left_Timer	rs.w	1
Gummi_Left_Offset	rs.w	1
Gummi_Left_Flag	rs.w	1
Gummi_Right_Timer	rs.w	1
Gummi_Right_Offset	rs.w	1
Gummi_Right_Flag	rs.w	1
Gummi_Saug_Min	rs.w	1
Gummi_Saug_Max	rs.w	1
Gummi_Saug_Offset	rs.w	1
Gummi_Grav_Flag	rs.w	1
Gummi_Grav_Timer	rs.w	1
Gummi_Hit_Timer	rs.w	1
Gummi_Hit_Zhler	rs.w	1
Gummi_Boost_Flag	rs.w	1
Gummi_Boost_Offset	rs.w	1
Gummi_Boost_Timer	rs.w	1
Gummi_Button_Bits	rs.w	1
Gummi_Button_Flag	rs.w	1
Gummi_Exit_Timer	rs.w	1
Gummi_Flame_Offset	rs.w	1
Gummi_Flame_Timer	rs.w	1
Gummi_Flame_Zeiger	rs.l	1
Gummi_Boost_Zeiger	rs.l	1
GUMMI_SIZEOF	rs.w	0

; ==========================================================================

		rsset	$FFE000
Liane_Struktur	rs.b	LIANE_ENTRY_LENGTH*10+WORD
Gummi_Struktur	rs.b	GUMMI_SIZEOF
Flame_Struktur	rs.b	FLAME_SIZEOF*FLAME_MAX
VARIABLEN_SIZEOF	rs.w	0

; ==========================================================================

			rsreset
Platsch_X			rs.w	1
Platsch_Y			rs.w	1
Platsch_X_Flag		rs.w	1
Platsch_Y_Flag		rs.w	1
Platsch_X_Speed		rs.w	1
Platsch_X_Float		rs.w	1
Platsch_Y_Speed		rs.w	1
Platsch_Y_Float		rs.w	1
Platsch_X_Acc		rs.w	1
Platsch_X_AccTimer		rs.w	1
Platsch_Y_Acc		rs.w	1
Platsch_Y_AccTimer		rs.w	1
Platsch_Slow_Timer		rs.w	1
Platsch_Objekt_Timer	rs.w	1
Platsch_Objekt_Offset	rs.w	1
Platsch_Mine_Offset		rs.w	1
Platsch_Wait_Timer		rs.w	1
Platsch_Flame_Flag		rs.w	1
Platsch_Water_Flag		rs.w	1
Platsch_Water_Offset	rs.w	1
Platsch_Water_Base		rs.w	1
Platsch_Flame_Timer		rs.w	1
Platsch_Task_Offset		rs.w	1
Platsch_Hit_Timer		rs.w	1
Platsch_Hit_Anzahl		rs.w	1
Platsch_Hit_Flag		rs.w	1
Platsch_Hit_Tod		rs.w	1
Platsch_Flame_Zeiger	rs.l	1
Platsch_Task_Zeiger		rs.l	1
PLATSCH_SIZEOF		rs.w	0

; ==========================================================================

PLATSCH_BRAKE	EQU	20	;Beschleunigung beim Abbremsen
PLATSCH_REVERSE	EQU	40	;Beschleunigung von Rand weg
PLATSCH_X_MIN	EQU	213	;Linker Rand des Beckens
PLATSCH_X_MAX	EQU	343	;Rechter Rand des Beckens
PLATSCH_FALL	EQU	60	;Beschleunigung beim Fallen
PLATSCH_SINKTIEFE	EQU	48	;Sinktiefe bevor Abbremsen
PLATSCH_SINKPROZ	EQU	20	;Prozentsatz, der Abbremsen regelt
PLATSCH_GAS_ACC	EQU	-30	;Beschleunigungswert beim Gasgeben
PLATSCH_GAS_TIME	EQU	60	;Beschleunigungszeit beim Gasgeben
PLATSCH_SLOW_ACC	EQU	-10	;Beschleunigungswert beim Gasgeben
PLATSCH_SLOW_TIME	EQU	10	;Beschleunigungszeit beim Gasgeben
PLATSCH_LINKS	EQU	150
PLATSCH_RECHTS	EQU	730

; ==========================================================================

TASK3_WAIT	EQU	0
TASK3_XACC	EQU	1
TASK3_BRANCH	EQU	2
TASK3_MINE	EQU	3

; ==========================================================================

MINE_MAX		EQU	4
MBUBBLE_MAX	EQU	8

; ==========================================================================

		rsreset
Mine_Used		rs.w	1
Mine_Expl_Flag	rs.w	1
Mine_Expl_Offset	rs.w	1
Mine_Expl_Timer	rs.w	1
Mine_X_Position	rs.w	1
Mine_Y_Position	rs.w	1
Mine_X_Speed	rs.w	1
Mine_Y_Speed	rs.w	1
Mine_X_Float	rs.w	1
Mine_Y_Float	rs.w	1
MINE_SIZEOF	rs.w	0

; ==========================================================================

		rsreset
MBubble_Used	rs.w	1
MBubble_X_Position	rs.w	1
MBubble_Y_Position	rs.w	1
MBubble_Y_Speed	rs.w	1
MBubble_Y_Float	rs.w	1
MBubble_Timer	rs.w	1
MBubble_Anim	rs.w	1
MBubble_Offset	rs.w	1
MBubble_BlubTimer	rs.w	1
MBUBBLE_SIZEOF	rs.w	0

; ==========================================================================

		rsset	$FFE000
Platsch_Struktur	rs.b	PLATSCH_SIZEOF
Flame3_Struktur	rs.b	FLAME_SIZEOF*FLAME_MAX
Mine_Struktur	rs.b	MINE_SIZEOF*MINE_MAX
MBubble_Struktur	rs.b	MBUBBLE_SIZEOF*MBUBBLE_MAX
VARIABLEN3_SIZEOF	rs.w	0

; ==========================================================================

		rsreset
Lemming_X_Position	rs.w	1
Lemming_Y_Position	rs.w	1
Lemming_X_Speed	rs.w	1
Lemming_Y_Speed	rs.w	1
Lemming_X_Acc	rs.w	1
Lemming_Y_Acc	rs.w	1
Lemming_X_Float	rs.w	1
Lemming_Y_Float	rs.w	1
Lemming_Timer	rs.w	1
Lemming_Anzahl	rs.w	1
Lemming_KillTimer	rs.w	1
Lemming_BumpFlag	rs.w	1
Lemming_BipTimer	rs.w	1
Lemming_Hit_Timer	rs.w	1
Lemming_Hit_Flag	rs.w	1
Lemming_Hit_Anzahl	rs.w	1
Lemming_Hit_Dead	rs.w	1
Lemming_Hit_Offset	rs.w	1
Lemming_Hit_Delay	rs.w	1
Lemming_Hit_Zhler	rs.w	1
Lemming_Task_Offset	rs.w	1
Lemming_Task_Zeiger	rs.l	1
LEMMING_SIZEOF	rs.w	0

; ==========================================================================

TASK4_ACC		EQU	0
TASK4_CLRXACC	EQU	1
TASK4_CLRYACC	EQU	2
TASK4_WAIT	EQU	3
TASK4_BRANCH	EQU	4
TASK4_ENTER	EQU	5

LEMMING_LEFT	EQU	54
LEMMING_RIGHT	EQU	606

; ==========================================================================

		rsset	$FFE000
Lemming_Struktur	rs.b	LEMMING_SIZEOF
VARIABLEN4_SIZEOF	rs.w	0

; ==========================================================================

Gegner1_Info	dc.l	Gegner1_Init
		dc.w	160,65
		dc.l	Gegner1_Anim
		dc.w	0,0
		dc.b	0,BOB_HI_PRIO

; ==========================================================================

Bumper1_Info	dc.l	Init_MiBumper
		dc.w	28,32
		dc.l	MiBumper_Wait_Anm
		dc.w	0,8
		dc.b	0,BOB_HI_PRIO

; ==========================================================================

Gegner2_Info	dc.l	Gegner2_Init
		dc.w	140,160
		dc.l	Gegner2_Anim
		dc.w	0,0
		dc.b	0,BOB_HI_PRIO

; ==========================================================================

Button_Info1	dc.l	Init_Button_1
		dc.w	16,32
		dc.l	MiButton_Wait_Anim
		dc.w	0,0
		dc.b	0,BOB_HI_PRIO
Button_Info2	dc.l	Init_Button_2
		dc.w	16,32
		dc.l	MiButton_Wait_Anim
		dc.w	0,0
		dc.b	0,BOB_HI_PRIO
Button_Info3	dc.l	Init_Button_3
		dc.w	16,32
		dc.l	MiButton_Wait_Anim
		dc.w	0,0
		dc.b	0,BOB_HI_PRIO

; ==========================================================================

Gegner3_Info	dc.l	Gegner3_Init
		dc.w	96,320
		dc.l	NullAnim
		dc.w	0,0
		dc.b	0,BOB_HI_PRIO

; ==========================================================================

WBumper1_Info	dc.l	Init_WMiBumper
		dc.w	28,32
		dc.l	WMiBumper_Wait_Anm
		dc.w	0,8
		dc.b	0,BOB_HI_PRIO

; ==========================================================================

Door_Info		dc.l	Door_Init
		dc.w	64,16
		dc.l	Door_Anim_Norm
		dc.w	0,0
		dc.b	0,BOB_HI_PRIO

; ==========================================================================

SM_MOV_W_NOTHING_I	dc.l	I_Mover_WaterRout_1_Mi
		dc.w	15,64
		dc.l	MMover_AnimTable
		dc.w	0,-1
		dc.b	0,BOB_HI_PRIO

; ==========================================================================

Gegner4_Info	dc.l	Gegner4_Init
		dc.w	6*32,75
		dc.l	Gegner4_Anim
		dc.w	0,0
		dc.b	BACK_ANIM,BOB_HI_PRIO

; ==========================================================================

EExplo_Info	dc.l	EExplo_Init
		dc.w	40,40
		dc.l	NullAnim
		dc.w	0,0
		dc.b	0,BOB_HI_PRIO

; ==========================================================================

Lemming_Info	dc.l	Lemming_Init
		dc.w	8,8
		dc.l	NullAnim
		dc.w	0,0
		dc.b	0,BOB_HI_PRIO

; ==========================================================================

EBumper1_Info	dc.l	Init_EMiBumper
		dc.w	28,32
		dc.l	EMiBumper_Wait_Anm
		dc.w	0,8
		dc.b	0,BOB_HI_PRIO

; ==========================================================================

NUM_M_Huhn_I	dc.l	RoutRts
		dc.w	36,32
		dc.l	MHuhn_Right_Anm
		dc.w	0,8
		dc.b	0,BOB_MID_PRIO

; ==========================================================================
;
; Initialisierungsphase
;
; a5 = Zeiger auf MainRout-Table
; a6 = Zeiger auf Work-RAM
;
; ==========================================================================

		;Parallax initialisieren
Init_Mickey	cmp	#2,Glo_Level(a6)
		beq	.No_Parallax
		jsr	Init_TekknoParallax

		;Adresse fr Block-Definition setzen
.No_Parallax	move.l	#TEKKNO_Block_Entry_Adrs,Scr_Block_EntryAdrs(a6)

		;Font uploaden
		lea	Tekkno_world_bin_p,a0
		move	#260,d0
		jsr	Load_World
		move.l	#Tekkno_Coltab,Base_Coltab(a6)
		lea	Mickey_LoadList(pc),a0
		jsr	Execute_LoadList

		;Adresse fr ColourTable setzen
		move.l	#Tekkno_Coltab,Base_Coltab(a6)
		move.l	#GemVram_Tekkno,GemVramAdrs(a6)

		;Setup (Global) fr VRAM
		moveq	#0,d0
		lea	Mickey_Global_VRam,a1
		lea	Mickey.0_bin_p,a0
		jsr	LoadVRam_crunched

		;Setup (Individual) fr VRAM
		moveq	#0,d0
		lea	Tekkno_EnemyVRam,a1
		move	Glo_Level(a6),d1
		lea	Mickey_World_List,a0
		lsl	#3,d1
		move.l	(a0,d1.w),a0
		jsr	LoadVRam_crunched

		;Alle Tren sind geschloen
		clr	Open_Door_But(a6)

		;Adresse fr Level-Table setzen
		move.l	#Mickey_Level,Glo_Leveltable(a6)

		;Adresse Nutz setzen
		move.w	#Nutz_VRam>>5,TEMET_Prio(a6)

		;Adresse fr Fontne setzen
		move	#(Tekkno_EnemyVRam/32)+138,Boss_VRam(a6)

		;Speziellen Startup-Code aufrufen
		move	Glo_Level(a6),d0
		lea	Mickey_World_List,a0
		lsl	#3,d0
		add.l	LONG(a0,d0.w),a0
		jmp	(a0)

; ==========================================================================

Mickey_World_List
		dc.l	Mickey.1_bin_p,Init_Mickey_00-Mickey_World_List
		dc.l	Mickey.2_bin_p,Init_Mickey_01-Mickey_World_List
		dc.l	Mickey.3_bin_p,Init_Mickey_02-Mickey_World_List
		dc.l	Mickey.4_bin_p,Init_Mickey_03-Mickey_World_List

; ==========================================================================

Mickey_Level	dc.l	Gegner.Level1.enemy.segap
		dc.l	Gegner.Level1.segap
		dc.w	2000,2000,-1
		dc.l	Gegner.Level2.enemy.segap
		dc.l	Gegner.Level2.segap
		dc.w	2000,2000,-1
		dc.l	Gegner.Level3.enemy.segap
		dc.l	Gegner.Level3.segap
		dc.w	2000,2000,-1
		dc.l	Gegner.Level4.enemy.segap
		dc.l	Gegner.Level4.segap
		dc.w	2000,2000,-1

; ==========================================================================

Mickey_LoadList	dc.w	0,Tekkno_ParaVRam
		dc.l	Tekkno_para1_bin_p
		dc.w	352,Tekkno_Para2VRam
		dc.l	Tekkno_para2_raw
		dc.w	512,Tekkno_SpriteVRam
		dc.l	Tekkno_sprite_raw
		dc.w	256,Under_WaterVRam
		dc.l	WATER_raw
		dc.w	-1

; ==========================================================================

Flame_Sigel_List	dc.w	%101<<13!32
		SIGEL	%1111,TILES_FIRE1,0,0
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!32
		SIGEL	%1111,TILES_FIRE2,0,0
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!32
		SIGEL	%1111,TILES_FIRE3,0,0
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!32
		SIGEL	%1111,TILES_FIRE4,0,0
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!32
		SIGEL	%1111,TILES_FIRE5,0,0
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!32
		SIGEL	%1111,TILES_FIRE6,0,0
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!32
		SIGEL	%1111,TILES_FIRE7,0,0
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!32
		SIGEL	%1111,TILES_FIRE8,0,0
		dc.w	-1

; ==========================================================================

Expl_Sigel_List	dc.w	%101<<13!32
		SIGEL	%1111,TILES_EXPL1,0,0
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!32
		SIGEL	%1111,TILES_EXPL2,0,0
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!32
		SIGEL	%1111,TILES_EXPL3,0,0
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!32
		SIGEL	%1111,TILES_EXPL4,0,0
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!32
		SIGEL	%1111,TILES_EXPL5,0,0
		dc.w	-1
		ds.w	3

; ==========================================================================
;
; Spezielle Initialisierungen fr Endgegner I (Springer)
;
; ==========================================================================

		;Endgegner-Song
Init_Mickey_00	moveq	#9,d0
		moveq	#0,d1
		jsr	Play_Song

		;Info fr Objekte setzen
		lea	Bob_Info_Tab_Adrs(a6),a1
		move	#Gegner1_Info-Bob_Info_Start,2*NUM_GEGNER1(a1)
		move	#Bumper1_Info-Bob_Info_Start,2*NUM_BUMPER1(a1)

		;Kein unten rausfallen
		st	Y_Dead_Allowed(a6)

		;Keine Sulen im Parallax
		st	TBalken_Flag(a6)

		;Endgegner eintragen
		moveq	#NUM_GEGNER1,d0
		moveq	#0,d1
		moveq	#0,d2
		lea	Area_Enter_Vector(a6),a1
		jmp	Search_Bob_Entry

; ==========================================================================

Gegner1_Anim	dc.w	0
		dc.l	Gegner1_Sigel
		dc.w	0,0
		dc.w	ENTRY_END
		dc.l	Gegner1_Anim

; ==========================================================================

Gegner1_Sigel	dc.w	%100<<13!80
		SIGEL	%0110,TILES_JUMP1,64,00
		SIGEL	%0110,TILES_JUMP2,00,35
		SIGEL	%1110,TILES_JUMP3,48,24
		SIGEL	%1111,TILES_JUMP4,16,33
		SIGEL	%1101,TILES_JUMP5,48,48
		SIGEL	%1101,TILES_JUMP6,16,17
		SIGEL	%0101,TILES_JUMP7,48,08
		dc.w	-1

; ==========================================================================

Klappe1_Sigel	dc.w	%100<<13!24
		SIGEL	%1010,TILES_KLAPPE_L,0,0
		dc.w	-1

; ==========================================================================

Klappe2_Sigel	dc.w	%100<<13!16
		SIGEL	%1001,TILES_KLAPPE_M,0,0
		dc.w	-1

; ==========================================================================

Fu1_Sigel	dc.w	%100<<13!32
		SIGEL	%1111,TILES_BEIN_L,0,0
		dc.w	-1

; ==========================================================================

Fu2_Sigel	dc.w	%100<<13!32
		SIGEL	%1111,TILES_BEIN_M,0,0
		dc.w	-1

; ==========================================================================

Stachel_Sigel	dc.w	%100<<13!48
		SIGEL	%1110,TILES_STACHEL1,0,0
		SIGEL	%0101,TILES_STACHEL2,-16,5
		dc.w	-1

; ==========================================================================

MiBumper_Wait_Anm	dc.w	0
		dc.l	Bumper1.1_Sigel
		dc.w	0,+15
		dc.w	ENTRY_END
		dc.l	MiBumper_Wait_Anm

; ==========================================================================

MiBumper_Work_Anm	dc.w	0
		dc.l	Bumper1.1_Sigel
		dc.w	0,+18
		dc.w	0
		dc.l	Bumper1.2_Sigel
		dc.w	0,+20
		dc.w	0
		dc.l	Bumper1.2_Sigel
		dc.w	0,+20
		dc.w	0
		dc.l	Bumper1.1_Sigel
		dc.w	0,+18
		dc.w	0
		dc.l	Bumper1.1_Sigel
		dc.w	0,+15
		dc.w	ENTRY_END
		dc.l	MiBumper_Wait_Anm

; ==========================================================================

Bumper1.1_Sigel	dc.w	%000<<13!32
		SIGEL	%1110,TILES_BUMPER1,0,0
		dc.w	-1

; ==========================================================================

Bumper1.2_Sigel	dc.w	%000<<13!32
		SIGEL	%1101,TILES_BUMPER2,0,0
		dc.w	-1

; ==========================================================================
;
; Spezielle Initialisierungen fr Endgegner II (Gummi)
;
; ==========================================================================

		;Endgegner-Song
Init_Mickey_01	moveq	#9,d0
		moveq	#0,d1
		jsr	Play_Song

		;Flammen-Routine einfgen
		lea	Bob_System,a0
		lea	Display_Flame,a1
		jsr	Insert_Mickey_Main

		;Kein unten rausfallen
		st	Y_Dead_Allowed(a6)

		;Keine Sulen im Parallax
		st	TBalken_Flag(a6)

		;Info fr Objekte setzen
		lea	Bob_Info_Tab_Adrs(a6),a1
		move	#Gegner2_Info-Bob_Info_Start,2*NUM_GEGNER(a1)
		move	#Door_Info-Bob_Info_Start,2*NUM_DOOR(a1)
		move	#Button_Info1-Bob_Info_Start,2*NUM_BUTTON1(a1)
		move	#Button_Info2-Bob_Info_Start,2*NUM_BUTTON2(a1)
		move	#Button_Info3-Bob_Info_Start,2*NUM_BUTTON3(a1)

		;Endgegner eintragen
		moveq	#NUM_GEGNER,d0
		moveq	#0,d1
		moveq	#0,d2
		lea	Area_Enter_Vector(a6),a1
		jmp	Search_Bob_Entry

; ==========================================================================

Gegner2_Anim	dc.w	0
		dc.l	Gegner2_Sigel
		dc.w	0,0
		dc.w	ENTRY_END
		dc.l	Gegner2_Anim

; ==========================================================================

Door_Anim_Norm	dc.w	0
		dc.l	Door_Sigel
		dc.w	0,0
		dc.w	ENTRY_END
		dc.l	Door_Anim_Norm

; ==========================================================================

Door_Anim_Small	dc.w	0
		dc.l	Door_Sigel2
		dc.w	0,0
		dc.w	ENTRY_END
		dc.l	Door_Anim_Small

; ==========================================================================

Gegner2_Sigel	dc.w	%100<<13!64
		SIGEL	%1111,TILES_GUMMI1,00,00
		SIGEL	%1110,TILES_GUMMI2,00,32
		SIGEL	%1111,TILES_GUMMI3,32,00
		SIGEL	%1110,TILES_GUMMI4,32,32
		dc.w	-1

; ==========================================================================

Saugnapf_Sigel	dc.w	%101<<13!16
		SIGEL	%0111,TILES_HAND,0,0
		dc.w	-1

; ==========================================================================

Ring_Sigel	dc.w	%101<<13!16
		SIGEL	%0101,TILES_RING,0,0
		dc.w	-1

; ==========================================================================

Door_Sigel	dc.w	%001<<13!16
		SIGEL	%0111,TILES_DOOR1,00,00
		SIGEL	%0111,TILES_DOOR2,00,32
		dc.w	-1

; ==========================================================================

Door_Sigel2	dc.w	%001<<13!16
		SIGEL	%0111,TILES_DOOR2,00,32
		dc.w	-1

; ==========================================================================

Button_Sigel	dc.w	%001<<13!32
		SIGEL	%1101,TILES_BUTTON,00,00
		dc.w	-1

; ==========================================================================

MiButton_Wait_Anim	dc.w	0
		dc.l	Button_Sigel
		dc.w	0,0
		dc.w	ENTRY_END
		dc.l	MiButton_Wait_Anim

; ==========================================================================

MiButton_Press_Anim	dc.w	0
		dc.l	Button_Sigel
		dc.w	0,6
		dc.w	0
		dc.l	Button_Sigel
		dc.w	0,6
		dc.w	0
		dc.l	Button_Sigel
		dc.w	0,6
		dc.w	0
		dc.l	Button_Sigel
		dc.w	0,6
		dc.w	ENTRY_END
		dc.l	MiButton_Wait_Anim

; ==========================================================================

Saugnapf_PosTab	dc.b	$7e,3,3,2,3,2,3,2,2,2,2,1,2,1,0,1,0,1
		dc.b	-1,0,-1,-3,-4,-3,-3,-4,-4,-9,$7f
		even

; ==========================================================================

Flame_TimeTab	dc.w	4*50
		dc.w	2*50
		dc.w	1*50
		dc.w	-1

; ==========================================================================

Flame_Table_Start	dc.b	03,30,03,15,+5*BYTE
		dc.b	48,30,01,20,+5*BYTE
		dc.b	92,30,05,15,+5*BYTE
		dc.b	03,30,04,15,+5*BYTE
		dc.b	48,30,02,20,+5*BYTE
		dc.b	92,30,03,15,+5*BYTE
		dc.b	03,30,03,15,+5*BYTE
		dc.b	48,30,01,20,+5*BYTE
		dc.b	92,30,02,15,-8*5*BYTE
		even

; ==========================================================================

Expl_Table_Gummi	dc.b	48,-05,04,+4*BYTE
		dc.b	16,+00,08,+4*BYTE
		dc.b	80,+05,10,+4*BYTE
		dc.b	25,-02,12,+4*BYTE
		dc.b	75,+07,05,+4*BYTE
		dc.b	56,+10,08,-4*5*BYTE
		even

; ==========================================================================

Gravitation_Tabelle	dc.w	-0000
		dc.w	-0400
		dc.w	-0700
		dc.w	-0900
		dc.w	-1200
		dc.w	-0900
		dc.w	-0700
		dc.w	-0400
		dc.w	-0000
		dc.w	-0000

; ==========================================================================

Saugnapf_DelayTab_1	dc.b	75,15,75,20,30,35,-1
Saugnapf_DelayTab_2	dc.b	75,15,40,15,20,10,-1
Saugnapf_DelayTab_3	dc.b	40,15,25,15,20,15,-1
		even

; ==========================================================================

L_Display_Struct	dc.w	LIANE_ENTRY_LENGTH*0+WORD
		dc.l	Saugnapf_Sigel
		dc.w	LIANE_ENTRY_LENGTH*1+WORD
		dc.l	Ring_Sigel
		dc.w	LIANE_ENTRY_LENGTH*2+WORD
		dc.l	Ring_Sigel
		dc.w	LIANE_ENTRY_LENGTH*3+WORD
		dc.l	Ring_Sigel
		dc.w	LIANE_ENTRY_LENGTH*5+WORD
		dc.l	Ring_Sigel
		dc.w	LIANE_ENTRY_LENGTH*6+WORD
		dc.l	Ring_Sigel
		dc.w	LIANE_ENTRY_LENGTH*7+WORD
		dc.l	Ring_Sigel
		dc.w	LIANE_ENTRY_LENGTH*8+WORD
		dc.l	Saugnapf_Sigel

; ==========================================================================
;
; Spezielle Initialisierungen fr Endgegner III (Wasser)
;
; ==========================================================================

		;Endgegner-Song
Init_Mickey_02	moveq	#9,d0
		moveq	#0,d1
		jsr	Play_Song

		;Prioritt Playfield A lschen
		lea	Scr_Macros(a6),a0
		move	#260*4-1,d0
.Loop_Prioritt	and	#%0111111111111111,(a0)+
		dbf	d0,.Loop_Prioritt

		;Playfield B lschen
		move.l	#%01<<30!$c>>2,$c00004
		move	#64*32-1,d0
		moveq	#0,d1
.Loop_Clear	move	d1,$c00000
		dbf	d0,.Loop_Clear

		;Info fr Objekte setzen
		lea	Bob_Info_Tab_Adrs(a6),a1
		move	#Gegner3_Info-Bob_Info_Start,2*NUM_GEGNER(a1)
		move	#WBumper1_Info-Bob_Info_Start,2*NUM_BUTTON1(a1)
		move	#SM_MOV_W_NOTHING_I-Bob_Info_Start,2*NUM_BUTTON2(a1)
		move	#ST_FONTNE_I-Bob_Info_Start,2*ST_FONTNE(a1)

		;Kein unten rausfallen
		st	Y_Dead_Allowed(a6)

		;Wasser initialiseren
		move.w	#5*64,UnderWaterMax(a6)
		move.w	#6,UnderWaterShift(a6)
		move.w	#0,UnderWaterTest(a6)

		;Endgegner eintragen
		moveq	#NUM_GEGNER,d0
		moveq	#0,d1
		moveq	#0,d2
		lea	Area_Enter_Vector(a6),a1
		jsr	Search_Bob_Entry

		;Fontne initialiseren
		clr	Bob_X_Position(a4)
		move	Water_YPos(a6),Bob_Y_Position(a4)
		jsr	Init_Fontne

		;Wasser initialisieren
		jmp	Init_TekknoWaterParallax

; ==========================================================================

Platsch_Map	Incbin	Binary/Mickey/Mickey.3.MAP.c

; ==========================================================================

MMover_AnimTable	dc.w	0
		dc.l	MMover_Sigel
		dc.w	0,0
		dc.w	ENTRY_END
		dc.l	MMover_AnimTable

; ==========================================================================

MMover_Sigel	dc.w	%101<<13!64
		SIGEL	%1101,TILES_WATER_MOVER,00,00
		dc.w	-1

; ==========================================================================

MBubble_Sigel1	dc.w	%101<<13!16
		SIGEL	%0101,TILES_WATER_BUBBLE1,08,10
		dc.w	-1

; ==========================================================================

MBubble_Sigel2	dc.w	%101<<13!16
		SIGEL	%0101,TILES_WATER_BUBBLE2,08,10
		dc.w	-1

; ==========================================================================

WMiBumper_Wait_Anm	dc.w	0
		dc.l	WBumper1.1_Sigel
		dc.w	0,+15
		dc.w	ENTRY_END
		dc.l	WMiBumper_Wait_Anm

; ==========================================================================

WMiBumper_Work_Anm	dc.w	0
		dc.l	WBumper1.1_Sigel
		dc.w	0,+18
		dc.w	0
		dc.l	WBumper1.2_Sigel
		dc.w	0,+20
		dc.w	0
		dc.l	WBumper1.2_Sigel
		dc.w	0,+20
		dc.w	0
		dc.l	WBumper1.1_Sigel
		dc.w	0,+18
		dc.w	0
		dc.l	WBumper1.1_Sigel
		dc.w	0,+15
		dc.w	ENTRY_END
		dc.l	WMiBumper_Wait_Anm

; ==========================================================================

WBumper1.1_Sigel	dc.w	%000<<13!32
		SIGEL	%1110,TILES_WATER_BUMPER1,0,0
		dc.w	-1

; ==========================================================================

WBumper1.2_Sigel	dc.w	%000<<13!32
		SIGEL	%1101,TILES_WATER_BUMPER2,0,0
		dc.w	-1

; ==========================================================================
;
; VSRAM und Scroll-RAM im VBL setzen
;
; ==========================================================================

Platsch_VSRAM	movem.l	d0/a0,-(sp)
		lea	Platsch_Struktur,a0
		tst	Platsch_Hit_Timer(a0)
		beq	.Normal
		subq	#1,Platsch_Hit_Timer(a0)
		eor	#1,Platsch_Hit_Flag(a0)
		beq	.Normal
		move	#$8407,$c00004
		move.l	#$40000000+$30020003,$c00004
		move	Scr_X_Level_Pos(a6),$c00000
		move.l	#$40000010+$00020000,$c00004
		move	Scr_Y_Level_Pos(a6),$c00000
		bra	.Done
.Normal		move	#$8406,$c00004
		move.l	#$40000010+$00020000,$c00004
		move	Platsch_Y(a0),d0
		sub	Scr_Y_Level_Pos(a6),d0
		sub	Platsch_Y_Flag(a0),d0
		and	#%0000000000000111,d0
		eor	#%0000000000000111,d0
		sub	Platsch_Y_Flag(a0),d0
		addq	#8,d0
		move	d0,$c00000
		move.l	#$40000000+$30020003,$c00004
		move	Platsch_X(a0),d0
		sub	Scr_X_Level_Pos(a6),d0
		sub	Platsch_X_Flag(a0),d0
		and	#%0000000000000111,d0
		subq	#8,d0
		move	d0,$c00000
.Done		movem.l	(sp)+,d0/a0
		rts

Platsch_VSRAM_Dark	bsr	Platsch_VSRAM
		jmp	TSet_Dark_Color
Platsch_VSRAM_Light	bsr	Platsch_VSRAM
		jmp	Set_Nothing

; ==========================================================================
;
; Initialiserungs-Routine fr den Gegner
;
; ==========================================================================

		;Platsch-Struktur lschen
Gegner3_Init	lea	Platsch_Struktur,a0
		move	#VARIABLEN3_SIZEOF-Platsch_Struktur-1,d0
		moveq	#0,d1
.Loop		clr.b	(a0)+
		dbf	d0,.Loop
		sub	#VARIABLEN3_SIZEOF-Platsch_Struktur,a0

		;Struktur initialisieren
		move	#200,Platsch_X(a0)
		move	#300,Platsch_Y(a0)

		lea	Gegner3_Task_Table,a1
		move.l	a1,Platsch_Task_Zeiger(a0)
		lea	Flame_Table_Gegner3,a1
		move.l	a1,Platsch_Flame_Zeiger(a0)
		lea	Gegner3_Routine,a0
		move.l	a0,Bob_Routine(a4)
		move	#410,WaterBase(a6)
		rts

; ==========================================================================

Gegner3_Task_Table	dc.b	TASK3_WAIT,150
		dc.b	TASK3_MINE
		dc.b	TASK3_XACC,20,40
		dc.b	TASK3_WAIT,50
		dc.b	TASK3_MINE
		dc.b	TASK3_MINE
		dc.b	TASK3_XACC,30,30
		dc.b	TASK3_WAIT,150
		dc.b	TASK3_MINE
		dc.b	TASK3_XACC,-20,40
		dc.b	TASK3_WAIT,75
		dc.b	TASK3_MINE
		dc.b	TASK3_MINE
		dc.b	TASK3_XACC,-30,20
		dc.b	TASK3_BRANCH,Gegner3_Task_Table-*

; ==========================================================================

Gegner3_MineTable	dc.w	062,012,-1400,-1000
		dc.w	094,000,-2000,-1000
		dc.w	201,000,+1400,-1000
		dc.w	233,012,+2000,-1000
		dc.w	-1

; ==========================================================================

Gegner3_WaterTable	dc.b	2,4,6,8,10
		dc.b	9,9,8,7,6,5
		dc.b	3,1,0,-1,-3
		dc.b	-6,-7,-8,-9,-9
		dc.b	-10,-9,-9,-8
		dc.b	-7,-6,-4,-1,0
		dc.b	$7f

; ==========================================================================

Gegner3_WaitTable	dc.w	4*50,2*50,3*50
		dc.w	1*50,-1

; ==========================================================================

Flame_Table_Gegner3	dc.b	170,69,10,9,+5*BYTE
		dc.b	130,66,06,6,+5*BYTE
		dc.b	145,70,08,9,+5*BYTE
		dc.b	132,68,12,9,+5*BYTE
		dc.b	157,67,06,6,+5*BYTE
		dc.b	160,66,12,9,-5*5*BYTE
		even

; ==========================================================================
;
; Objekt-Handler des Gegners
;
; a4 = Zeiger auf Bob-Eintrag
;
; ==========================================================================
Check_GlobalRoutMi
		move.l	#Mover_MGlobal_Water,Bob_Routine(a4)
		rts

I_Mover_WaterRout_1_Mi
		*--*>Init Values for MoverYRout
		move.w	#200,Bob_Out_X_Val(a4)
		jsr	Check_GlobalRoutMi
		move.l	#Move_With_Water,Mover_Move_Routine(a4)
		move.b	#121,Mover_X_Wait_Time(a4)
		*--*>Set Mover to WaterY
		clr.b	Mover_Set_To_Water(a4)
		move	Water_YPos(a6),d0
		move	d0,Bob_Y_Position(a4)
		sub	#MOVER_WATER_SUB,Bob_Y_Position(a4)
		*--*>Init Y Offset
		move	#WAIT_JUMP,Mover_Y_Offset(a4)
		*--*>Init Left or Right
		rts

Mover_MGlobal_Water:
		*--*>Global Routs for Mover Water
		lea	WorkRam,a2
		tst.b	Mover_TEMET_On(a4)
		beq.s	.Nothing
		cmp	#MOVER,TEMET_Status(a2)
		beq.s	.Nothing
		clr.b	Mover_TEMET_On(a4)
		;rts
.Nothing
		jsr	Test_Bob_Out
		move.l	Mover_Move_Routine(a4),a0
		jsr	(a0)
		*--*>Test Temet on Top
		move.b	Mover_TEMET_On(a4),d0
		move	d0,-(sp)
		jsr	Test_TEMET_On_Top
		move	(sp)+,d0
		*--*>Test if should Init Y Jump
		tst.b	d0
		beq.s	.TEMET_WAS_NOT_ON
.TEMET_WAS_ON	*--Temet war drauf
		tst.b	Mover_TEMET_On(a4)
		bne.s	.Go_Ende
		move	#WM_JUMP_END,Mover_Y_Offset(a4)
		bra.s	.Go_Ende
.TEMET_WAS_NOT_ON	*--Temet war nicht drauf
		tst.b	Mover_TEMET_On(a4)
		beq.s	.Go_Ende
		move	#WM_JUMP_ANF,Mover_Y_Offset(a4)
.Go_Ende		*--*>Show Mover
		jsr	Show_Mickey_Object
		moveq	#1,d2
		jmp	Show_Mickey_XObject

; ==========================================================================
;
; Objekt-Handler des Gegners
;
; a4 = Zeiger auf Bob-Eintrag
;
; ==========================================================================

Gegner3_Routine	lea	Platsch_Struktur,a0
		tst	Platsch_Hit_Timer(a0)
		beq	.No_Tod_Test
		tst	Platsch_Hit_Tod(a0)
		beq	.No_Tod_Test
		move.b	#1,Finish(a6)

		;Makro-Sprache ausfhren
.No_Tod_Test	move.l	Platsch_Task_Zeiger(a0),a1
		add	Platsch_Task_Offset(a0),a1
		tst	Platsch_Hit_Tod(a0)
		bne	.Handle_Enemy
		moveq	#0,d0
		move.b	(a1),d0
		cmp.b	#TASK3_WAIT,d0
		beq	.Task_Wait
		cmp.b	#TASK3_XACC,d0
		beq	.Task_XAcc
		cmp.b	#TASK3_BRANCH,d0
		beq	.Task_Branch

		; ============
		; TASK3 - MINE
		; ============

.Task_Mine	lea	Gegner3_MineTable,a3
		move	Platsch_Mine_Offset(a0),d0
		lsl	#3,d0
		add	d0,a3
		cmp	#-1,(a3)
		bne	.Mine_Offset_Ok
		clr	Platsch_Mine_Offset(a0)
		bra	.Task_Mine
.Mine_Offset_Ok	addq	#1,Platsch_Mine_Offset(a0)
		movem	(a3)+,d0/d1
		add	Bob_X_Position(a4),d0
		add	Bob_Y_Position(a4),d1
		lea	Mine_Struktur,a2
		moveq	#MINE_MAX-1,d2
.Loop_Search_Mine	tst	Mine_Used(a2)
		bne	.Mine_Used
		move	#1,Mine_Used(a2)
		movem	d0/d1,Mine_X_Position(a2)
		clr	Mine_Expl_Flag(a2)
		clr	Mine_Expl_Offset(a2)
		movem	(a3)+,d0/d1
		movem	d0/d1,Mine_X_Speed(a2)
		moveq	#13,d0
		jsr	TFMX+16
		bra	.Mine_Ok
.Mine_Used	add	#MINE_SIZEOF,a2
		dbf	d2,.Loop_Search_Mine
.Mine_Ok		addq	#1*BYTE,Platsch_Task_Offset(a0)
		bra	.Handle_Enemy

		; ==============
		; TASK3 - BRANCH
		; ==============

.Task_Branch	move.b	1*BYTE(a1),d0
		ext	d0
		add	d0,Platsch_Task_Offset(a0)
		bra	.Handle_Enemy

		; ============
		; TASK3 - XACC
		; ============

.Task_XAcc	move.b	1*BYTE(a1),d0
		ext	d0
		move	d0,Platsch_X_Acc(a0)
		moveq	#0,d0
		move.b	2*BYTE(a1),d0
		move	d0,Platsch_X_AccTimer(a0)
		addq	#3*BYTE,Platsch_Task_Offset(a0)
		bra	.Handle_Enemy

		; ============
		; TASK3 - WAIT
		; ============

.Task_Wait	tst	Platsch_Wait_Timer(a0)
		bne	.Wait_Countdown
		move.b	1*BYTE(a1),d0
		move	d0,Platsch_Wait_Timer(a0)
		bra	.Handle_Enemy
.Wait_Countdown	subq	#1,Platsch_Wait_Timer(a0)
		bne	.Handle_Enemy
		addq	#2*BYTE,Platsch_Task_Offset(a0)

		; ================
		; GEGNER VERWALTEN
		; ================

		;Horizontale Bewegung verwalten
.Handle_Enemy	tst	Platsch_X_AccTimer(a0)
		beq	.X_Bremsen
		subq	#1,Platsch_X_AccTimer(a0)
		move	Platsch_X_Acc(a0),d0
		add	d0,Platsch_X_Speed(a0)
		bra	.X_Speed_Ok
.X_Bremsen	tst	Platsch_X_Speed(a0)
		bpl	.X_Positiv
.X_Negativ	add	#PLATSCH_BRAKE,Platsch_X_Speed(a0)
		bmi	.X_Speed_Ok
.X_Clear		clr	Platsch_X_Speed(a0)
		bra	.X_Speed_Ok
.X_Positiv	sub	#PLATSCH_BRAKE,Platsch_X_Speed(a0)
		bmi	.X_Clear

		;Range beachten
.X_Speed_Ok	cmp	#PLATSCH_X_MIN,Platsch_X(a0)
		bhs	.Min_Ok
		add	#PLATSCH_REVERSE,Platsch_X_Speed(a0)
.Min_Ok		cmp	#PLATSCH_X_MAX,Platsch_X(a0)
		bls	.Max_Ok
		sub	#PLATSCH_REVERSE,Platsch_X_Speed(a0)
.Max_Ok		move	Platsch_X_Speed(a0),d0
		add	d0,Platsch_X_Float(a0)
		move.b	Platsch_X_Float(a0),d0
		ext	d0
		add	d0,Platsch_X(a0)
		clr.b	Platsch_X_Float(a0)

		;Langsames Beschleunigen, wenn aus Wasser
		tst	Platsch_Slow_Timer(a0)
		beq	.Kein_Slow
		subq	#1,Platsch_Slow_Timer(a0)
		bne	.Kein_Slow
		move	#PLATSCH_GAS_ACC,Platsch_Y_Acc(a0)
		move	#PLATSCH_GAS_TIME,Platsch_Y_AccTimer(a0)
		bra	.Y_Speed_Ok

		;Auf Wasseroberflche liegen
.Kein_Slow	tst	Platsch_Objekt_Timer(a0)
		beq	.Kein_Liegen
		subq	#1,Platsch_Objekt_Timer(a0)
		bne	.Kein_Gas_geben
		move	#PLATSCH_SLOW_ACC,Platsch_Y_Acc(a0)
		move	#PLATSCH_SLOW_TIME,Platsch_Y_AccTimer(a0)
		move	#PLATSCH_SLOW_TIME,Platsch_Slow_Timer(a0)
.Kein_Gas_geben	move	Platsch_Y(a0),d0
		moveq	#0,d1
		move	Water_YPos(a6),d2
		sub	#40,d2
		tst	Platsch_Hit_Tod(a0)
		beq	.Nicht_Tod
		add	#80,d2
		move	#10,Platsch_Objekt_Timer(a0)
.Nicht_Tod	moveq	#0,d3
		bsr	Approach_to_Point
		move	d0,Platsch_Y(a0)
		bra	.Y_Speed_Ok

		;Falls Objekt noch in der Luft, wirkt 
		;die Erdanziehungskraft!

.Kein_Liegen	move	Platsch_Y(a0),d0
		move	Water_YPos(a6),d1
		sub	#80,d1
		sub	d1,d0
		bpl	.Eingetaucht
		add	#PLATSCH_FALL,Platsch_Y_Speed(a0)
		bra	.Y_Speed_Ok

		;Objekt ist auf die Wasseroberflche
		;aufgeschlagen und bremst nun degressiv
		;bis NULL ab!

.Eingetaucht	tst	Platsch_Y_AccTimer(a0)
		bne	.Y_Speed_Ok
		tst	Platsch_Water_Flag(a0)
		bne	.Kein_Wassereffekt
		tst	Platsch_Y_Speed(a0)
		beq	.Kein_Wassereffekt
		move	#1,Platsch_Water_Flag(a0)
		clr	Platsch_Water_Offset(a0)
		move	WaterBase(a6),Platsch_Water_Base(a0)
.Kein_Wassereffekt	moveq	#0,d1
		move	Platsch_Y_Speed(a0),d1
		mulu	#PLATSCH_SINKPROZ,d1
		divu	#100,d1
		sub	d1,Platsch_Y_Speed(a0)
		cmp	#16,Platsch_Y_Speed(a0)
		bhi	.Y_Speed_Ok
		clr	Platsch_Y_Speed(a0)
.Get_Time		lea	Gegner3_WaitTable,a1
		add	Platsch_Objekt_Offset(a0),a1
		move	(a1),d0
		bpl	.Time_Ok
		clr	Platsch_Objekt_Offset(a0)
		bra	.Get_Time
.Time_Ok		move	d0,Platsch_Objekt_Timer(a0)
		addq	#WORD,Platsch_Objekt_Offset(a0)

		;Vertikalen Speed verrechnen
.Y_Speed_Ok	clr	Platsch_Flame_Flag(a0)
		tst	Platsch_Y_AccTimer(a0)
		beq	.Y_Time_Ok
		move	#1,Platsch_Flame_Flag(a0)
		subq	#1,Platsch_Y_AccTimer(a0)
		move	Platsch_Y_Acc(a0),d0
		add	d0,Platsch_Y_Speed(a0)
.Y_Time_Ok	move	Platsch_Y_Speed(a0),d0
		move	Platsch_Y(a0),d1
		move	Water_YPos(a6),d2
		sub	#50,d2
		sub	d2,d1
		bmi	.Nicht_unter_Wasser
		asr	#1,d0
.Nicht_unter_Wasser	add	d0,Platsch_Y_Float(a0)
		move.b	Platsch_Y_Float(a0),d0
		ext	d0
		add	d0,Platsch_Y(a0)
		clr.b	Platsch_Y_Float(a0)

		;Wasser-Effekt ???
		tst	Platsch_Water_Flag(a0)
		beq	.Copy_Position
		lea	Gegner3_WaterTable,a1
		add	Platsch_Water_Offset(a0),a1
		moveq	#0,d0
		move.b	(a1),d0
		cmp.b	#$7f,d0
		bne	.Water_Ok
		clr	Platsch_Water_Flag(a0)
		bra	.Copy_Position
.Water_Ok		ext	d0
		add	Platsch_Water_Base(a0),d0
		move	d0,WaterBase(a6)
		addq	#BYTE,Platsch_Water_Offset(a0)

		;Position bertragen
.Copy_Position	move	Platsch_X(a0),Bob_X_Position(a4)
		move	Platsch_Y(a0),Bob_Y_Position(a4)

		;Hit-Routinen
		movem.l	d0-d7/a0-a6,-(sp)		;Wurde Nutz getroffen ???
		tst	Platsch_Hit_Timer(a0)
		bne	.No_TopBob
		lea	WorkRam,a2
		moveq	#0,d0
		move.b	TEMET_ANZ_HitPoints(a2),d0
		move	d0,-(sp)
		jsr	Test_TEMET_Hit
		move	(sp)+,d0
		cmp.b	TEMET_ANZ_HitPoints(a2),d0
		bls	.No_Scream
		moveq	#23,d0
		jsr	TFMX+16
.No_Scream	lea	WorkRam,a2		;Hat Nutz getroffen ???
		cmp	#2,TEMET_Shield_Flag(a2)
		bne	.No_TopBob
		jsr	KollTopBobTest
		tst	d7
		bmi	.No_TopBob
		moveq	#9,d0
		jsr	TFMX+16
		jsr	Make_Bump
		lea	Platsch_Struktur,a0
		move	#75,Platsch_Hit_Timer(a0)
		clr	Platsch_Hit_Flag(a0)
		addq	#1,Platsch_Hit_Anzahl(a0)
		cmp	#HITS_WATER,Platsch_Hit_Anzahl(a0)
		blo	.No_TopBob
		moveq	#22,d0
		jsr	TFMX+16
		move	#300,Platsch_Hit_Timer(a0)
		move	#1,Platsch_Hit_Tod(a0)
.No_TopBob	movem.l	(sp)+,d0-d7/a0-a6

		;Handle Minen
		lea	Mine_Struktur,a1
		moveq	#MINE_MAX-1,d2
.Loop_Handle_Mine	tst	Mine_Used(a1)
		beq	.No_Mine

		tst	Mine_Expl_Flag(a1)
		beq	.No_Mine_Expl
		subq	#1,Mine_Expl_Timer(a1)
		bpl	.No_Mine
		move	#3,Mine_Expl_Timer(a1)
		addq	#1,Mine_Expl_Offset(a1)
		cmp	#5,Mine_Expl_Offset(a1)
		blo	.No_Mine
		clr	Mine_Used(a1)
		bra	.No_Mine

.No_Mine_Expl	move	Mine_X_Speed(a1),d0
		add	d0,Mine_X_Float(a1)
		move.b	Mine_X_Float(a1),d0
		ext	d0
		add	d0,Mine_X_Position(a1)
		clr.b	Mine_X_Float(a1)
		move	Mine_Y_Speed(a1),d0
		add	d0,Mine_Y_Float(a1)
		move.b	Mine_Y_Float(a1),d0
		ext	d0
		add	d0,Mine_Y_Position(a1)
		clr.b	Mine_Y_Float(a1)
		tst	Mine_X_Speed(a1)
		bpl	.Mine_X_Sub
.Mine_X_Add	add	#20,Mine_X_Speed(a1)
		bmi	.Mine_X_Ok
		clr	Mine_X_Speed(a1)
		bra	.Mine_X_Ok
.Mine_X_Sub	sub	#20,Mine_X_Speed(a1)
		bpl	.Mine_X_Ok
		clr	Mine_X_Speed(a1)
.Mine_X_Ok	cmp	#PLATSCH_LINKS,Mine_X_Position(a1)
		bhs	.Mine_Links_Ok
		add	#2,Mine_X_Position(a1)
		neg	Mine_X_Speed(a1)
.Mine_Links_Ok	cmp	#PLATSCH_RECHTS,Mine_X_Position(a1)
		bls	.Mine_Rechts_Ok
		sub	#2,Mine_X_Position(a1)
		neg	Mine_X_Speed(a1)
.Mine_Rechts_Ok	add	#50,Mine_Y_Speed(a1)
		move	Mine_Y_Position(a1),d0
		add	#16,d0
		cmp	Water_YPos(a6),d0
		bls	.No_Mine
		movem.l	d0-d7/a0-a5,-(sp)
		move	Bob_X_Position(a4),-(sp)
		move	Bob_Y_Position(a4),-(sp)
		move	Mine_X_Position(a1),Bob_X_Position(a4)
		sub	#8,Bob_X_Position(a4)
		move	Water_YPos(a6),Bob_Y_Position(a4)
		moveq	#11,d0
		jsr	TFMX+16
		jsr	Init_Fontne
		move	(sp)+,Bob_Y_Position(a4)
		move	(sp)+,Bob_X_Position(a4)
		movem.l	(sp)+,d0-d7/a0-a5
		move	#1,Mine_Expl_Flag(a1)
		move	#3,Mine_Expl_Timer(a1)
.No_Mine		add	#MINE_SIZEOF,a1
		dbf	d2,.Loop_Handle_Mine

		;Display Minen
.Display_Mine	movem	Bob_X_Position(a4),d0/d1
		movem	d0/d1,-(sp)
		movem	Bob_Width(a4),d0/d1
		movem	d0/d1,-(sp)
		move	#32,Bob_Width(a4)
		move	#32,Bob_Height(a4)
		lea	Mine_Struktur,a1
		moveq	#MINE_MAX-1,d7
.Loop_Mine	tst	Mine_Used(a1)
		beq	.Unused_Mine
		movem	Mine_X_Position(a1),d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		movem.l	d7/a0-a3,-(sp)
		;jsr	Test_TEMET_Hit
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		tst	Mine_Expl_Flag(a1)
		beq	.Normale_Mine_Gfx
		lea	Expl_Sigel_List,a0
		move	Mine_Expl_Offset(a1),d7
		lsl	#4,d7
		add	d7,a0
		bra	.Show_Mine
.Normale_Mine_Gfx	lea	Gegner3.1_Sigel,a0
.Show_Mine	jsr	Show_Simple_Mickey
		movem.l	(sp)+,d7/a0-a3
.Unused_Mine	add	#MINE_SIZEOF,a1
		dbf	d7,.Loop_Mine
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_Width(a4)
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)

		;Handle Flammen
		lea	Flame3_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Handle	tst	Flame_Used(a1)
		beq	.No_Flame
		move	Flame_Speed(a1),d0
		add	d0,Flame_Float(a1)
		move.b	Flame_Float(a1),d0
		ext	d0
		add	d0,Flame_Y_Position(a1)
		clr.b	Flame_Float(a1)
		sub	#16,Flame_Speed(a1)
		bpl	.Speed_Ok
		clr	Flame_Speed(a1)
.Speed_Ok		subq	#1,Flame_Timer(a1)
		bpl	.No_Flame
		move	#3,Flame_Timer(a1)
		addq	#1,Flame_Anim(a1)
		cmp	#8,Flame_Anim(a1)
		blo	.No_Flame
		clr	Flame_Used(a1)

		;Bubble fr Flamme eintragen
		move.l	a0,-(sp)
		lea	MBubble_Struktur,a0
		moveq	#MBUBBLE_MAX-1,d0
.Loop_Src_MBubble	tst	MBubble_Used(a0)
		bne	.MBubble_is_used
		move	#1,MBubble_Used(a0)
		move	Flame_X_Position(a1),MBubble_X_Position(a0)
		move	Flame_Y_Position(a1),MBubble_Y_Position(a0)
		move	#-136,MBubble_Y_Speed(a0)
		clr	MBubble_Timer(a0)
		clr	MBubble_Offset(a0)
		bra	.MBubble_Ok
.MBubble_is_used	add	#MBUBBLE_SIZEOF,a0
		dbf	d0,.Loop_Src_MBubble
.MBubble_Ok	move.l	(sp)+,a0

.No_Flame		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Handle

		;Neue Flammen ???
		tst	Platsch_Flame_Flag(a0)
		beq	.Keine_Flamme
		subq	#1,Platsch_Flame_Timer(a0)
		bpl	.Keine_Flamme
		move.l	Platsch_Flame_Zeiger(a0),a1
		moveq	#0,d0
		move.b	(a1)+,d0
		moveq	#0,d1
		move.b	(a1)+,d1
		moveq	#0,d2
		move.b	(a1)+,d2
		move	d2,Platsch_Flame_Timer(a0)
		moveq	#0,d3
		move.b	(a1)+,d3
		lsl	#6,d3
		move.b	(a1),d2
		ext	d2
		ext.l	d2
		add.l	d2,Platsch_Flame_Zeiger(a0)

		;Ja, also eintragen
		add	Bob_X_Position(a4),d0
		add	Bob_Y_Position(a4),d1
		lea	Flame3_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Search	tst	Flame_Used(a1)
		bne	.Used
		move	#1,Flame_Used(a1)
		movem	d0/d1,Flame_X_Position(a1)
		clr	Flame_Anim(a1)
		move	d3,Flame_Speed(a1)
		clr	Flame_Float(a1)
		move	#3,Flame_Timer(a1)
		moveq	#2,d0
		jsr	TFMX+16
		bra	.Keine_Flamme
.Used		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Search

		;Display Flammen
.Keine_Flamme	movem	Bob_X_Position(a4),d0/d1
		movem	d0/d1,-(sp)
		lea	Flame3_Struktur,a0
		moveq	#FLAME_MAX-1,d7
.Loop_Flame	tst	Flame_Used(a0)
		beq	.Unused
		movem	Flame_X_Position(a0),d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		movem.l	d7/a0-a3,-(sp)
		eor	#1,Flame_Frame(a0)
		beq	.No_Interlace
		add	#22,Bob_Y_Position(a4)
.No_Interlace	move	Flame_Anim(a0),d7
		lsl	#4,d7
		lea	Flame_Sigel_List,a0
		add	d7,a0
		jsr	Show_Simple_Mickey
.Ok		movem.l	(sp)+,d7/a0-a3
.Unused		add	#FLAME_SIZEOF,a0
		dbf	d7,.Loop_Flame
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)

		;Handle Bubbles
		lea	MBubble_Struktur,a1
		moveq	#MBUBBLE_MAX-1,d2
		move	Water_YPos(a6),d1
		sub	#16,d1
.Loop_Handle_Bubble	tst	MBubble_Used(a1)
		beq	.No_Bubble
		subq	#1,MBubble_BlubTimer(a1)
		bpl	.No_Blub
		move	#50,MBubble_BlubTimer(a1)
		moveq	#6,d0
		jsr	TFMX+16
.No_Blub		move	MBubble_Y_Speed(a1),d0
		add	d0,MBubble_Y_Float(a1)
		move.b	MBubble_Y_Float(a1),d0
		ext	d0
		add	d0,MBubble_Y_Position(a1)
		clr.b	MBubble_Y_Float(a1)
		lea	Bubble_Vert_4,a2
		add	MBubble_Offset(a1),a2
		move.b	(a2),d0
		ext	d0
		add	d0,MBubble_X_Position(a1)
		addq	#1,MBubble_Offset(a1)
		cmp	#324,MBubble_Offset(a1)
		blo	.MOffset_Ok
		clr	MBubble_Offset(a1)
.MOffset_Ok	subq	#1,MBubble_Timer(a1)
		bpl	.MBubble_Positiv
		move	#8,MBubble_Timer(a1)
		eor	#1,MBubble_Anim(a1)
.MBubble_Positiv	cmp	MBubble_Y_Position(a1),d1
		blo	.No_Bubble
		clr	MBubble_Used(a1)
.No_Bubble	add	#MBUBBLE_SIZEOF,a1
		dbf	d2,.Loop_Handle_Bubble

		;Display Bubbles
		movem	Bob_X_Position(a4),d0/d1
		movem	d0/d1,-(sp)
		lea	MBubble_Struktur,a0
		moveq	#MBUBBLE_MAX-1,d7
.Loop_MBubbles	tst	MBubble_Used(a0)
		beq	.Unused_MBubble
		movem	MBubble_X_Position(a0),d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		movem.l	d7/a0-a3,-(sp)
		tst	MBubble_Anim(a0)
		beq	.MBubble_Anim_NULL
		lea	MBubble_Sigel2,a0
		bra	.Show_MBubble
.MBubble_Anim_NULL	lea	MBubble_Sigel1,a0
.Show_MBubble	jsr	Show_Simple_Mickey
		movem.l	(sp)+,d7/a0-a3
.Unused_MBubble	add	#MBUBBLE_SIZEOF,a0
		dbf	d7,.Loop_MBubbles
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)

		;Hole Zeiger auf Base-VRAM und Map
		lea	$c000,a1
		lea	Platsch_Map,a0
		lea	Platsch_Struktur,a2

		;Position und Breite des horizontalen Bereiches berechnen
		clr	Platsch_X_Flag(a2)
		clr	Platsch_Y_Flag(a2)
		moveq	#44,d2
		move	Platsch_X(a2),d0
		sub	Scr_X_Level_Pos(a6),d0
		bpl	.Pos_X
		neg	d0
		move	#1,Platsch_X_Flag(a2)
		lsr	#3,d0
		sub	d0,d2
		beq	.Done
		bmi	.Done
		add	d0,d0
		add	d0,a0
		sub	#WORD,a1
		bra	.Ok_X
.Pos_X		lsr	#3,d0
		sub	d0,d2
		beq	.Done
		bmi	.Done
		add	d0,d0
		add	d0,a1

		;Position und Hhe des vertikalen Bereiches berechnen
.Ok_X		moveq	#30,d3
		moveq	#16,d4
		move	d3,d5
		sub	d4,d5
		move	Platsch_Y(a2),d1
		sub	Scr_Y_Level_Pos(a6),d1
		bpl	.Pos_Y
		neg	d1
		move	#1,Platsch_Y_Flag(a2)
		lsr	#3,d1
		sub	d1,d3
		beq	.Done
		bmi	.Done
		sub	d1,d4
		bmi	.Done
		lsl	#7,d1
		add	d1,a0
		sub	#64*WORD,a1
		bra	.Ok_Y
.Pos_Y		lsr	#3,d1
		sub	d1,d3
		beq	.Done
		bmi	.Done
		cmp	d5,d1
		bls	.No
		move	d1,-(sp)
		sub	d5,d1
		sub	d1,d4
		move	(sp)+,d1
.No		lsl	#7,d1
		add	d1,a1

		;D2 = Breite in Chars
		;D4 = Hhe in Chars

		;Chars in Playfield B kopieren
.Ok_Y		move	d2,d0
		add	d0,d0
		subq	#1,d4
		bmi	.Done
.Loop		movem.l	d0/d4/a0/a1,-(sp)
		jsr	AddDMA
		movem.l	(sp)+,d0/d3/a0/a1
		add	#64*WORD,a0
		add	#64*WORD,a1
		dbf	d4,.Loop
.Done		rts

; ===========================================================================

Gegner3.1_Sigel	dc.w	%001<<13!32
		SIGEL	%1111,TILES_WATER_MINE,0,0
		dc.w	-1

; ===========================================================================
;
; Approach present Point to final Position
;
; d0 = X-Position of present Point
; d1 = Y-Position of present Point
; d2 = X-Position of final Point
; d3 = Y-Position of final Point
;
; ===========================================================================

Approach_to_Point	movem.l	d2-d7,-(sp)
		moveq	#0,d4
		moveq	#0,d5
		sub	d0,d2
		beq.s	.s1_Done
		addq	#1,d4
		tst	d2
		bpl.s	.s1_Done
		moveq	#-1,d4	;sgn(x2-x1)
		neg	d2	;abs(x2-x1)
.s1_Done		sub	d1,d3
		beq.s	.s2_Done
		addq	#1,d5
		tst	d3
		bpl.s	.s2_Done
		moveq	#-1,d5	;sgn(y2-y1)
		neg	d3	;abs(y2-y1)
.s2_Done		cmp	d3,d2	;if dx < dy then exchange
		bhi.s	.No_Turn
		exg	d3,d2
		move	#1,-(sp)	;t=1
		bra.s	.Turned
.No_Turn		move	#0,-(sp)	;t=0
.Turned		move	d3,d6
		lsl	#1,d6
		sub	d2,d6	;2*dy-dx
		bmi.s	.d_neg
		tst	(sp)
		beq.s	.y_and_s2
		add	d4,d0	;x=x+s1
		bra.s	.d_neg
.y_and_s2		add	d5,d1	;y=y+s2
.d_neg		tst	(sp)+
		bne.s	.y_and_s2_2
		add	d4,d0	;x=x+s1
		bra.s	.Done
.y_and_s2_2	add	d5,d1
.Done		movem.l	(sp)+,d2-d7
		rts

; ==========================================================================
;
; Spezielle Initialisierungen fr Endgegner IV (Lemming)
;
; ==========================================================================

		;End-Endgegner-Song
Init_Mickey_03	moveq	#9,d0
		moveq	#1,d1
		jsr	Play_Song

		;Info fr Objekte setzen
		lea	Bob_Info_Tab_Adrs(a6),a1
		move	#Gegner4_Info-Bob_Info_Start,2*NUM_GEGNER4(a1)
		move	#Lemming_Info-Bob_Info_Start,2*NUM_Lemming(a1)
		move	#NUM_M_Huhn_I-Bob_Info_Start,2*NUM_M_Huhn(a1)
		move	#EBumper1_Info-Bob_Info_Start,2*NUM_EBUMPER(a1)
		move	#EExplo_Info-Bob_Info_Start,2*NUM_EEXPLO(a1)

		;Huhn-Gfx rippen
		lea	Mickey_RipListe(pc),a0
		lea	Tekkno_EnemyVRam+TILES_LEMMING_HUHN*32,a1
		jsr	Rip_Gfx

		;Kein unten rausfallen
		st	Y_Dead_Allowed(a6)

		;Keine Sulen im Parallax
		st	TBalken_Flag(a6)

		;Endgegner eintragen
		moveq	#NUM_GEGNER4,d0
		moveq	#0,d1
		moveq	#0,d2
		lea	Area_Enter_Vector(a6),a1
		jmp	Search_Bob_Entry

; ==========================================================================

Mickey_RipListe	dc.w	CMD_DECRUNCH
		dc.l	Tekkno_ene_bin_p
		dc.w	16*32
		dc.l	TChick_Obj0
		dc.w	2*32
		dc.l	TChick_Obj2
		dc.w	2*32
		dc.l	TChick_Obj3
		dc.w	CMD_DECRUNCH
		dc.l	Mickey.3_bin_p
		dc.w	(4*3+4*2)*32
		dc.l	WBumper1.1_Sigel
		dc.w	CMD_END

; ==========================================================================
;
; Initialisierungsphase fr den Lemming
;
; ==========================================================================

Gegner4_Init	lea	Lemming_Struktur,a0
		move	#VARIABLEN4_SIZEOF-Lemming_Struktur-1,d0
.Loop		clr.b	(a0)+
		dbf	d0,.Loop
		lea	Lemming_Struktur,a0
		move	#100,Lemming_X_Position(a0)
		move	#230,Lemming_Y_Position(a0)
		move	#75,Lemming_KillTimer(a0)
		move	#3,Lemming_Hit_Zhler(a0)
		lea	Task_Tabelle_4,a1
		move.l	a1,Lemming_Task_Zeiger(a0)
		lea	Gegner4_Routine,a0
		move.l	a0,Bob_Routine(a4)
		move	#550,WaterBase(a6)
		rts

; ==========================================================================

Gegner4_Anim	dc.w	0
		dc.l	Gegner4.1_Sigel
		dc.w	0,0
		dc.w	ENTRY_END
		dc.l	Gegner4_Anim

; ==========================================================================

Gegner4.1_Sigel	dc.w	%001<<13!75
		SIGEL	%1011,TILES_LEMMING_01,51,00
		SIGEL	%1111,TILES_LEMMING_02,43,32
		SIGEL	%1111,TILES_LEMMING_03,43,64
		SIGEL	%1001,TILES_LEMMING_07,23,16
		SIGEL	%1111,TILES_LEMMING_08,11,32
		SIGEL	%1111,TILES_LEMMING_09,11,64
		dc.w	-1

; ==========================================================================

Gegner4.2_Sigel	dc.w	%001<<13!75
		SIGEL	%1111,TILES_LEMMING_04,+43,+00
		SIGEL	%1111,TILES_LEMMING_05,+43,+32
		SIGEL	%1111,TILES_LEMMING_06,+43,+64
		SIGEL	%1111,TILES_LEMMING_10,+11,+00
		SIGEL	%1111,TILES_LEMMING_11,+11,+32
		SIGEL	%1001,TILES_LEMMING_12,+19,+64
		SIGEL	%0110,TILES_LEMMING_13,-05,-03
		SIGEL	%0110,TILES_LEMMING_14,-05,+21
		dc.w	-1

; ==========================================================================

MiHuhn_Sigel	dc.w	%101<<13!32
		SIGEL	%1111,TILES_LEMMING_HUHN,00,00
		dc.w	-1
MiHuhn_Sigel2	dc.w	%001<<13!32
		SIGEL	%1111,TILES_LEMMING_HUHN,00,00
		dc.w	-1

; ==========================================================================

MiFoot1_Sigel	dc.w	%101<<13!16
		SIGEL	%0100,TILES_LEMMING_FOOT1,00,00
		dc.w	-1

; ==========================================================================

MiFoot2_Sigel	dc.w	%101<<13!16
		SIGEL	%0100,TILES_LEMMING_FOOT2,00,00
		dc.w	-1

; ==========================================================================

Lemming_Sigel_List1	dc.w	%101<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+0,00,00
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+1,00,00
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+2,00,00
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+3,00,00
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+4,00,00
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+5,00,00
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+6,00,00
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+7,00,00
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+8,00,00
		dc.w	-1
		ds.w	3
		dc.w	%101<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+9,00,00
		dc.w	-1

; ==========================================================================

Lemming_Sigel_List2	dc.w	%001<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+0,00,00
		dc.w	-1
		ds.w	3
		dc.w	%001<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+1,00,00
		dc.w	-1
		ds.w	3
		dc.w	%001<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+2,00,00
		dc.w	-1
		ds.w	3
		dc.w	%001<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+3,00,00
		dc.w	-1
		ds.w	3
		dc.w	%001<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+4,00,00
		dc.w	-1
		ds.w	3
		dc.w	%001<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+5,00,00
		dc.w	-1
		ds.w	3
		dc.w	%001<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+6,00,00
		dc.w	-1
		ds.w	3
		dc.w	%001<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+7,00,00
		dc.w	-1
		ds.w	3
		dc.w	%001<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+8,00,00
		dc.w	-1
		ds.w	3
		dc.w	%001<<13!8
		SIGEL	%0000,TILES_LEMMING_VALS+9,00,00
		dc.w	-1

; ==========================================================================

EMiBumper_Wait_Anm	dc.w	0
		dc.l	EBumper1.1_Sigel
		dc.w	0,+15
		dc.w	ENTRY_END
		dc.l	EMiBumper_Wait_Anm

; ==========================================================================

EMiBumper_Work_Anm	dc.w	0
		dc.l	EBumper1.1_Sigel
		dc.w	0,+18
		dc.w	0
		dc.l	EBumper1.2_Sigel
		dc.w	0,+20
		dc.w	0
		dc.l	EBumper1.2_Sigel
		dc.w	0,+20
		dc.w	0
		dc.l	EBumper1.1_Sigel
		dc.w	0,+18
		dc.w	0
		dc.l	EBumper1.1_Sigel
		dc.w	0,+15
		dc.w	ENTRY_END
		dc.l	EMiBumper_Wait_Anm

; ==========================================================================

EBumper1.1_Sigel	dc.w	%100<<13!32
		SIGEL	%1110,TILES_LEMMING_BUMPER1,0,0
		dc.w	-1

; ==========================================================================

EBumper1.2_Sigel	dc.w	%100<<13!32
		SIGEL	%1101,TILES_LEMMING_BUMPER2,0,0
		dc.w	-1

; ==========================================================================

Task_Tabelle_4
.Loop		dc.b	TASK4_ACC,1,-2
		dc.b	TASK4_WAIT,20
		dc.b	TASK4_ENTER
		dc.b	TASK4_ACC,-4,2
		dc.b	TASK4_WAIT,50
		dc.b	TASK4_ENTER
		dc.b	TASK4_ACC,-2,-4
		dc.b	TASK4_WAIT,25
		dc.b	TASK4_ACC,4,4
		dc.b	TASK4_WAIT,50
		dc.b	TASK4_ENTER
		dc.b	TASK4_BRANCH,.Loop-*
		dc.b	-1
		even


Gegner4_ExploTab	dc.w	10,056,009
		dc.w	20,070,086
		dc.w	04,020,146
		dc.w	10,015,169
		dc.w	25,001,090
		dc.w	04,045,181
		dc.w	25,063,073
		dc.w	20,048,062
		dc.w	10,025,160
		dc.w	17,056,128
		dc.w	05,053,094
		dc.w	20,021,111
		dc.w	10,018,175
		dc.w	06,060,171
		dc.w	20,017,065
		dc.w	15,006,088
		dc.w	20,029,105
		dc.w	10,049,190
		dc.w	15,006,089
		dc.w	02,040,166
		dc.w	0

; ==========================================================================
;
; Verwaltungs-Routine fr den Lemming
;
; ==========================================================================

		;Hole Zeiger auf Lemming-Struktur
Gegner4_Routine	lea	Lemming_Struktur,a3
		subq	#1,Lemming_BipTimer(a3)

		;Groes Schlufeuerwerk
.Make_Explos	tst	Lemming_Hit_Dead(a3)
		beq	.No_Explos
		subq	#1,Lemming_Hit_Delay(a3)
		bpl	.No_Explos
		lea	Gegner4_ExploTab,a0
		add	Lemming_Hit_Offset(a3),a0
		move	(a0)+,Lemming_Hit_Delay(a3)
		bne	.No_Quit_Game
		clr	Lemming_Hit_Offset(a3)
		subq	#1,Lemming_Hit_Zhler(a3)
		bne	.Make_Explos
		move.b	#1,Finish(a6)
		bra	.Make_Explos
.No_Quit_Game	move	Bob_X_Position(a4),-(sp)
		move	Bob_Y_Position(a4),-(sp)
		movem	(a0)+,d0/d1
		add	Bob_X_Position(a4),d0
		add	Bob_Y_Position(a4),d1
		sub	#64,d0
		move	d0,Bob_X_Position(a4)
		move	d1,Bob_Y_Position(a4)
		moveq	#0,d3
		moveq	#0,d4
		movem.l	d0-d7/a0-a6,-(sp)
		jsr	Enter_HuhnExpl
		movem.l	(sp)+,d0-d7/a0-a6
		moveq	#11,d0
		jsr	TFMX+16
		move	(sp)+,Bob_Y_Position(a4)
		move	(sp)+,Bob_X_Position(a4)
		add	#3*WORD,Lemming_Hit_Offset(a3)

		;Hole neues Kommando
.No_Explos	move.l	Lemming_Task_Zeiger(a3),a0
		add	Lemming_Task_Offset(a3),a0
		move.b	(a0),d0
		cmp.b	#TASK4_ACC,d0
		beq	.Acc
		cmp.b	#TASK4_CLRXACC,d0
		beq	.Clear_X_Acc
		cmp.b	#TASK4_CLRYACC,d0
		beq	.Clear_Y_Acc
		cmp.b	#TASK4_WAIT,d0
		beq	.Wait
		cmp.b	#TASK4_BRANCH,d0
		beq	.Branch
		cmp.b	#TASK4_ENTER,d0
		bne	.Do_Main

		; ========================
		; Huhn eintragen
		; ========================

.Enter		addq	#1*BYTE,Lemming_Task_Offset(a3)
		movem.l	d0-d7/a0-a6,-(sp)
		tst	Lemming_Hit_Dead(a3)
		bne	.No_Lemming
		move	Lemming_X_Position(a3),d0
		add	#70,d0
		moveq	#0,d1
		jsr	Get_Block_Flags
		swap	d0
		btst	#SCR_EFFECT_BIT,d0
		beq	.No_Lemming
		moveq	#NUM_Lemming,d0
		move	Lemming_X_Position(a3),d1
		move	#500,d2
		add	#70,d1
		lea	Area_Enter_Vector(a6),a1
		jsr	Search_Bob_Entry
		move	#9,Bob_Special_1(a4)
		move	Lemming_KillTimer(a3),Bob_Special_2(a4)
.No_Lemming	movem.l	(sp)+,d0-d7/a0-a6
		bra	.Do_Main

		; ========================
		; Bedingungslos verzweigen
		; ========================

.Branch		move.b	1*BYTE(a0),d0
		ext	d0
		add	d0,Lemming_Task_Offset(a3)
		bra	.Do_Main

		; ===============
		; Dumchen drehen
		; ===============

.Wait		tst	Lemming_Timer(a3)
		beq	.Init_Wait
		subq	#1,Lemming_Timer(a3)
		bne	.Do_Main
		addq	#2*BYTE,Lemming_Task_Offset(a3)
		bra	.Do_Main
.Init_Wait	moveq	#0,d0
		move.b	1*BYTE(a0),d0
		move	d0,Lemming_Timer(a3)
		bra	.Do_Main

		; ================================
		; Vertikale Beschleunigung lschen
		; ================================

.Clear_Y_Acc	clr	Lemming_Y_Acc(a3)
		addq	#1*BYTE,Lemming_Task_Offset(a3)
		bra	.Do_Main

		; ==================================
		; Horizontale Beschleunigung lschen
		; ==================================

.Clear_X_Acc	clr	Lemming_X_Acc(a3)
		addq	#1*BYTE,Lemming_Task_Offset(a3)
		bra	.Do_Main

		; ==========================
		; Neue Beschleunigung setzen
		; ==========================

.Acc		tst	Lemming_Hit_Dead(a3)
		bne	.No_Y_Acc
		move.b	1*BYTE(a0),d0
		beq	.No_X_Acc
		ext	d0
		move	d0,Lemming_X_Acc(a3)
.No_X_Acc		move.b	2*BYTE(a0),d0
		beq	.No_Y_Acc
		ext	d0
		move	d0,Lemming_Y_Acc(a3)
.No_Y_Acc		addq	#3*BYTE,Lemming_Task_Offset(a3)

		;Level-Range beachten
.Do_Main		cmp	#4*16,Lemming_X_Position(a3)
		bge	.Range_XL_Ok
		add	#16,Lemming_X_Speed(a3)
.Range_XL_Ok	cmp	#30*16,Lemming_X_Position(a3)
		blt	.Range_XR_Ok
		sub	#16,Lemming_X_Speed(a3)
.Range_XR_Ok	cmp	#8*16,Lemming_Y_Position(a3)
		bge	.Range_YL_Ok
		add	#32,Lemming_Y_Speed(a3)
.Range_YL_Ok	cmp	#11*16,Lemming_Y_Position(a3)
		blt	.Range_YR_Ok
		sub	#32,Lemming_Y_Speed(a3)

		;Fliekommawerte berechnen
.Range_YR_Ok	move	Lemming_X_Acc(a3),d0
		add	d0,Lemming_X_Speed(a3)
		move	Lemming_X_Speed(a3),d0
		add	d0,Lemming_X_Float(a3)
		move.b	Lemming_X_Float(a3),d0
		ext	d0
		add	d0,Lemming_X_Position(a3)
		clr.b	Lemming_X_Float(a3)
		move	Lemming_Y_Acc(a3),d0
		add	d0,Lemming_Y_Speed(a3)
		move	Lemming_Y_Speed(a3),d0
		add	d0,Lemming_Y_Float(a3)
		move.b	Lemming_Y_Float(a3),d0
		ext	d0
		add	d0,Lemming_Y_Position(a3)
		clr.b	Lemming_Y_Float(a3)

		;bertrage Position
		movem	Lemming_X_Position(a3),d0/d1
		movem	d0/d1,Bob_X_Position(a4)

		;Display Gegner
		tst	Lemming_Hit_Timer(a3)
		beq	.No_Hit
		subq	#1,Lemming_Hit_Timer(a3)
		eor	#1,Lemming_Hit_Flag(a3)
		beq	.Done
.No_Hit		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Gegner4.1_Sigel,a0
		jsr	Show_Simple_Mickey
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Gegner4.1_Sigel,a0
		add	#75,Bob_X_Position(a4)
		jsr	Show_Big_Simple_Object
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Gegner4.2_Sigel,a0
		sub	#75,Bob_X_Position(a4)
		add	#3*32,Bob_Y_Position(a4)
		jsr	Show_Simple_Mickey
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Gegner4.2_Sigel,a0
		add	#75,Bob_X_Position(a4)
		jsr	Show_Big_Simple_Object
		sub	#3*32,Bob_Y_Position(a4)
.Done		rts

***************************************************************************************

Lemming_Huhn_Base	= Bob_Koords_Save1	;LW


Lemming_Init	
		*--*>Check if another Lemming is possible
		lea	Lemming_Struktur,a0
		cmp	#5,Lemming_Anzahl(a0)
		blo.s	.OKAY
		jmp	Out_Bob_Damage
		
.OKAY		*--*>Try Enter Lemming

		moveq	#NUM_M_Huhn,d0
		move	Bob_X_Position(a4),d1
		sub	#16,d1
		move	Bob_Y_Position(a4),d2
		lea	Area_Enter_Vector(a6),a1
		move.l	a4,a5
		jsr	Search_Bob_Entry
		tst	d0
		bpl.s	.NoOut
		move.l	a5,a4 
		jmp	Out_Bob_Damage

.NoOut		*--*>Enter Lemming

		;A4 = Zeiger auf Huhn
		;A5 = Zeiger auf Zahl

		jsr	Get_Zuffi_d0
		move.b	#1,WHuhn_X_Dir(a4)
		move.l	#MHuhn_Right_Anm,Bob_Next_Anim(a4)
		and	#1,d0
		beq.s	.OkRight
		move.l	#MHuhn_Left_Anm,Bob_Next_Anim(a4)
		move.b	#-1,WHuhn_X_Dir(a4)
.OkRight		jsr	Get_Next_Bob_Frame
		move	#-$0A80,MHuhn_Y_Speed(a4)
		move	#1,Bob_Status(a4)
		move.l	#Handle_MHuhn_Falling,Bob_Routine(a4)
		move.l	a4,Lemming_Huhn_Base(a5)
		move.l	#Lemming_Main,Bob_Routine(a5)
		lea	Lemming_Struktur,a0
		addq	#1,Lemming_Anzahl(a0)
		rts


Lemming_Main:	
		*--*>Get Pos of Lemming Huhn
		move.l	Lemming_Huhn_Base(a4),a5
		move	Bob_X_Position(a5),Bob_X_Position(a4)
		move	Bob_Y_Offset(a5),Bob_Y_Offset(a4)
		move	Bob_Y_Position(a5),Bob_Y_Position(a4)
		sub	#16,Bob_Y_Position(a4)

		*--*>Show Number
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3


		lea	Lemming_Sigel_List1,a0
		tst	Bob_Status(a5)
		beq	.Ok
		lea	Lemming_Sigel_List2,a0
.Ok		move	Bob_Special_1(a4),d0
		lsl	#4,d0
		add	d0,a0
		jsr	Show_Simple_Mickey

		;Countdown verwalten
		lea	Lemming_Struktur,a0
		move.l	Lemming_Huhn_Base(a4),a5
		subq	#1,Bob_Special_2(a4)
		bpl	.No_Countdown
		tst	Lemming_BipTimer(a0)
		bpl	.No_Bip
		move	#50,Lemming_BipTimer(a0)
		moveq	#28,d0
		jsr	TFMX+16
.No_Bip		move	Lemming_KillTimer(a0),Bob_Special_2(a4)
		subq	#1,Bob_Special_1(a4)
		bpl	.No_Countdown
		move	#1,MHuhn_Out(a5)
		bsr	Test_Kettenreaktion

		;Huhn/Number austragen ???
.No_Countdown	tst	Lemming_Hit_Dead(a0)
		beq	.No_Overkill
		move	#1,MHuhn_Out(a5)
.No_Overkill	tst	MHuhn_Out(a5)
		beq	.OKAY
		moveq	#11,d0
		jsr	TFMX+16
		moveq	#0,d3
		moveq	#0,d4
		jsr	Enter_HuhnExpl
		move.b	#BOB_FALSE,Bob_Used(a4)
		move.b	#BOB_FALSE,Bob_Used(a5)
		moveq	#11,d0
		jsr	TFMX+16

		;Groes Huhn getroffen ???
		lea	Lemming_Struktur,a0
		cmp.l	#Handle_MHuhn_Fly,Bob_Routine(a5)
		bne	.No_Hit
		tst	Lemming_Hit_Dead(a0)
		bne	.No_Hit

		movem	Bob_X_Position(a5),d0/d1
		add	#80,d0
		cmp	Lemming_X_Position(a0),d0
		blt	.No_Hit

		sub	#80+150+80-32,d0
		cmp	Lemming_X_Position(a0),d0
		bgt	.No_Hit

;		cmp	Lemming_Y_Position(a0),d1
;		blt	.No_Hit
;		sub	#200-32,d1
;		cmp	Lemming_Y_Position(a0),d1
;		bgt	.No_Hit
		move	#50,Lemming_Hit_Timer(a0)
		addq	#1,Lemming_Hit_Anzahl(a0)
		cmp	#HITS_LEMMING,Lemming_Hit_Anzahl(a0)
		blo	.No_Hit
		move	#1,Lemming_Hit_Dead(a0)
.No_Hit		subq	#1,Lemming_Anzahl(a0)
.OKAY		rts

; ==========================================================================
;
; Alle Hhner in der Umgebung zerplatzen lassen
;
; a5 = Zeiger auf Huhn-Objekt
;
; ==========================================================================

Test_Kettenreaktion	move.l	a0,-(sp)
		lea	Bob_Structure(a6),a0
		movem	Bob_X_Position(a5),d0/d1
.Loop		tst.b	Bob_Used(a0)
		bmi	.Unused
		cmp	#NUM_M_Huhn,Bob_Number(a0)
		bne	.Unused
		movem	Bob_X_Position(a0),d2/d3
		sub	d0,d2
		bpl	.X_Ok
		neg	d2
.X_Ok		cmp	#64,d2
		bhi	.Unused
		sub	d1,d3
		bpl	.Y_Ok
		neg	d3
.Y_Ok		cmp	#64,d3
		bhi	.Unused
		move	#1,MHuhn_Out(a0)
.Unused		lea	BOB_ENTRY_LENGTH(a0),a0
		cmp.l	#Bob_Structure_End,a0
		blo	.Loop
		move.l	(sp)+,a0
		rts

; ==========================================================================
;
; Explo-Routine eintragen
;
; ==========================================================================

Enter_HuhnExpl	move	#NUM_EEXPLO,d0
		move	Bob_X_Position(a4),d1
		subq	#8,d1
		move	Bob_Y_Position(a4),d2
		add	d3,d1
		add	d4,d2
		lea	Area_Enter_Vector(a6),a1
		move.l	a4,-(sp)
		jsr	Search_Bob_Entry
		move.l	(sp)+,a4
		rts

; ==========================================================================
;
; Explo-Routine initialiseren
;
; ==========================================================================

EExplo_Init	move	#4,Bob_Special_1(a4)
		move.l	#EExplo_Routine,Bob_Routine(a4)
		rts

; ==========================================================================
;
; Geilere Explo-Routine fr die Hhner (zerbatzt so richtig)
;
; ==========================================================================

		;Nutz getroffen ???
EExplo_Routine	
		lea	Lemming_Struktur,a0
		tst	Lemming_Hit_Dead(a0)
		bne	.No_TEMET_Hit
		jsr	Test_TEMET_Hit

		;Richtung und Entfernung berechnen
.No_TEMET_Hit	addq	#1,Bob_Special_3(a4)
		and	#3,Bob_Special_3(a4)
		addq	#2,Bob_Special_4(a4)
		move	Bob_Special_4(a4),d1
		move	d1,Bob_X_Offset(a4)
		move	d1,Bob_Y_Offset(a4)

		;Offsets entsprechend Richtung setzen
		move	Bob_Special_3(a4),d0
		bne	.No_Left
.Left		neg	Bob_X_Offset(a4)
		clr	Bob_Y_Offset(a4)
		bra	.Do_Anim
.No_Left		subq	#1,d0
		bne	.No_Right
.Right		clr	Bob_Y_Offset(a4)
		bra	.Do_Anim
.No_Right		subq	#1,d0
		bne	.Down
.Up		neg	Bob_Y_Offset(a4)
		clr	Bob_X_Offset(a4)
		bra	.Do_Anim
.Down		clr	Bob_X_Offset(a4)

		;Animation verwalten
.Do_Anim		subq	#1,Bob_Special_1(a4)
		bpl	.No
		move	#4,Bob_Special_1(a4)
		addq	#1,Bob_Special_2(a4)
		cmp	#5,Bob_Special_2(a4)
		blo	.No
		jmp	Out_Bob_Damage
.No		lea	Expl_Sigel_List,a0
		move	Bob_Special_2(a4),d0
		lsl	#4,d0
		add	d0,a0
		move.l	a0,Bob_SigelInfo(a4)
		jmp	Show_Mickey_Object

***************************************************************************************

; =====================================================================================
;
; ROUTINEN und TABLES fr LEMMING HUHN
;
; =====================================================================================
MHuhn_Out		=Bob_Hit		;W
MHuhn_Y_Speed	=Bob_Special_2	;W
MHuhn_X_Speed	=Bob_Power	;W

MHuhn_Anim_Adrs	dc.l	UHuhn_Skelett_Left,UHuhn_Skelett_Right
		dc.l	MHuhn_Left_Anm,MHuhn_Right_Anm
		dc.l	UHuhn_Skelett_Left,UHuhn_Skelett_Right
		dc.l	MiFoot2_Sigel,MiFoot1_Sigel
		dc.w	Tekkno_EnemyVRam/32
		dc.l	RoutRts
		dc.l	THuhn_Anim_L_P
		dc.l	THuhn_Anim_R_P
*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MHuhn_Right_Anm:	dc.w	1
		dc.l	MiHuhn_Sigel
		dc.w	8,0
		dc.w	ENTRY_END
		dc.l	MHuhn_Right_Anm
MHuhn_Left_Anm:	dc.w	0
		dc.l	MiHuhn_Sigel
		dc.w	-8,0
		dc.w	ENTRY_END
		dc.l	MHuhn_Left_Anm
*---------------------------------------------------------------------------------------
MHuhn_Init:	*--*>Init Anim Informations
		move.l	#MHuhn_Anim_Adrs,Huhn_Anim_Adrs(a4)
		move.l	#Show_TekknoObject,WHuhn_Show_Rout(a4)
		move.l	#Init_Ready_Bump,Huhn_Conv_RoutI(a4)
		move.l	#Huhn_Walk_Rout,Bob_Routine(a4)
		move.w	#20000,Bob_Out_X_Val(a4)
		move.w	#20000+32,Bob_Out_Y_Val(a4)
		move	Bob_X_Position(a4),d0
		move	Bob_Y_Position(a4),d1
		jsr	TestHuhnRout
		sub	d3,Bob_Y_Position(a4)
		clr.w	MHuhn_Out(a4)
		clr.w	MHuhn_X_Speed(a4)
		clr.w	MHuhn_Y_Speed(a4)
		rts
*---------------------------------------------------------------------------------------
****************************************************************************************
Init_Ready_Bump:	move.l	#I_Handle_MHuhn_Bumping,Bob_Routine(a4)
		subq	#4,TEMET_Y_Position(a6)
		rts

I_Handle_MHuhn_Bumping:
		move.l	#Handle_MHuhn_Bumping,Bob_Routine(a4)
		move	#$0380,MHuhn_Y_Speed(a4)

		tst.b	WHuhn_X_Dir(a4)
		bpl	.Right
.Left		sub	#$0400,MHuhn_X_Speed(a4)
		bra	.Done
.Right		add	#$0400,MHuhn_X_Speed(a4)
.Done		rts




Handle_MHuhn_Bumping:


		;In Laufrichtung horizontal bewegen
		move.b	MHuhn_X_Speed(a4),d0
		ext	d0
		add	d0,Bob_X_Position(a4)
		tst	MHuhn_X_Speed(a4)
		bpl	.Right
.Left		cmp	#LEMMING_LEFT,Bob_X_Position(a4)
		bhi	.Left_Ok
		neg	MHuhn_X_Speed(a4)
		addq	#2,Bob_X_Position(a4)
		bra	.Ok
.Left_Ok		add	#20,MHuhn_X_Speed(a4)
		bmi	.Ok
		clr	MHuhn_X_Speed(a4)
		move	#1,MHuhn_Out(a4)
		bra	.Ok
.Right		cmp	#LEMMING_RIGHT,Bob_X_Position(a4)
		blo	.Right_Ok
		neg	MHuhn_X_Speed(a4)
		subq	#2,Bob_X_Position(a4)
		bra	.Ok
.Right_Ok		sub	#20,MHuhn_X_Speed(a4)
		bpl	.Ok
		clr	MHuhn_X_Speed(a4)
		move	#1,MHuhn_Out(a4)

		;Huhn ber Bumper ???
.Ok		movem	Bob_X_Position(a4),d0/d1
		add	#16,d0
		add	#32,d1
		jsr	Get_Block_Flags
		swap	d0
		btst	#SCR_EFFECT_BIT,d0
		beq	.Handle_Fall
		lea	Lemming_Struktur,a0
		move	#1,Lemming_BumpFlag(a0)
		moveq	#29,d0
		jsr	TFMX+16
		move.l	#Handle_MHuhn_Fly,Bob_Routine(a4)
		move	#-$0700,MHuhn_Y_Speed(a4)

		*--*>SCHLUSSBUMPING
.Handle_Fall	bra	Make_MHuhn_Falling






Handle_MHuhn_Fly	jsr	Show_TekknoObject
		jsr	Test_TEMET_Hit
		;jsr	Test_TEMET_Hit_MHuhn
		move.b	MHuhn_Y_Speed(a4),d0
		ext.w	d0
		add	d0,Bob_Y_Position(a4)
		add	#48,MHuhn_Y_Speed(a4)
		bmi	.Done
		clr	MHuhn_Y_Speed(a4)
		move	#1,MHuhn_Out(a4)
.Done		rts


Handle_MHuhn_Falling:
		jsr	Make_MHuhn_Falling
		beq	.Done
		jsr	MHuhn_Init
.Done		rts

*-------------------------------------------------------------------------------------
MHUHN_MAX_FALL_SPEED	= $0500

Make_MHuhn_Falling:	add	#60,MHuhn_Y_Speed(a4)
		bmi.s	.OKAY
		clr	Bob_Status(a4)
		cmp	#MHUHN_MAX_FALL_SPEED,MHuhn_Y_Speed(a4)
		bls.s	.OKAY
		move	#MHUHN_MAX_FALL_SPEED,MHuhn_Y_Speed(a4)
.OKAY		move.b	MHuhn_Y_Speed(a4),d0
		ext.w	d0
		add	d0,Bob_Y_Position(a4)

		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	MiHuhn_Sigel,a0
		tst	Bob_Status(a4)
		beq	.Sigel_Ok
		lea	MiHuhn_Sigel2,a0
.Sigel_Ok	;jsr	Show_Simple_Mickey
		move.l	a0,Bob_SigelInfo(a4)
		jsr	Show_TekknoObject

		tst	Bob_Status(a4)
		bne	.Wird_geworfen
		jsr	Test_TEMET_Hit
.Wird_geworfen

		tst	MHuhn_Y_Speed(a4)
		bmi	.NoKollide
		jsr	Test_TEMET_Hit_MHuhn
		move	Bob_X_Position(a4),d0
		move	Bob_Y_Position(a4),d1
		add	#16,d0
		add	#32,d1
		jsr	Get_Block_Icon
		add	d0,d0
		add	d0,d0
		move.l	Scr_Block_EntryAdrs(a6),a1
		move.l	(a1,d0),a1
		cmp.b	#boden,Block_Through(a1)
		beq.s	.Kollide
		cmp.b	#swand,Block_Through(a1)
		bne.s	.NoKollide
.Kollide		move	#-16,d3
		move	#0,d4
		jsr	ENTER_SMOKE_Y_Offs
		cmp	#$0180,MHuhn_Y_Speed(a4)
		bls.s	.FertigGebumpt
.OKAY1		sub	#$0180,MHuhn_Y_Speed(a4)
		neg	MHuhn_Y_Speed(a4)
		and	#$fff0,Bob_Y_Position(a4)
.NoKollide	moveq	#0,d0
		rts
.FertigGebumpt	moveq	#-1,d0
		rts



Test_TEMET_Hit_MHuhn:
		lea	WorkRam,a2
		jsr	KollTopBobTest
		tst	d7
		bmi 	.NoKoll
		;--Kollision On
		jsr	Make_Bump
		*--*>out Huhn
		jsr	ENTER_SMOKE_Y
		move	#1,MHuhn_Out(a4)
		move.l	#RoutRts,Bob_Routine(a4)
		moveq	#9,d0
		jsr	TFMX+16
.NoKoll		rts

; ==========================================================================
;
; Initialiserungsphase fr den Springer
;
; ==========================================================================

Gegner1_Init	lea	Jump_Struktur,a0
		move	#VARIABLEN1_SIZEOF-Jump_Struktur-1,d0
.Loop		clr.b	(a0)+
		dbf	d0,.Loop
		lea	Jump_Struktur,a0
		move	#LEVEL_MAX,Jump_Level(a0)
		move	#656,Jump_X_Position(a0)
		move	#48,Jump_Gravitation(a0)
		move	#-1,Jump_Flame_Flag(a0)
		move	#0,Jump_Stachel_PosI(a0)
		move	#0,Jump_Stachel_PosS(a0)
		lea	Jump_Stack+STACK_SIZE(a0),a1
		move.l	a1,Jump_Stack_Zeiger(a0)
		lea	Flame_Table_Gegner1,a1
		move.l	a1,Jump_Flame_Zeiger(a0)
		lea	Task_Tabelle,a1
		move.l	a1,Jump_Task_Zeiger(a0)
		lea	Expl_Table_Gummi,a1
		move.l	a1,Jump_Boost_Zeiger(a0)
		lea	Gegner1_Routine,a0
		move.l	a0,Bob_Routine(a4)
		move	#700,WaterBase(a6)
		rts

; ==========================================================================

		;Erst 'ma 'n bichen Angst machen!
Task_Tabelle	dc.b	TASK_FALL
		dc.b	TASK_WAIT,50
		dc.b	TASK_GOSUB,.Play_Hydraulik-*

		;Zndet Triebwerke und fliegt nach links
		dc.b	TASK_WAIT,50
		dc.b	TASK_FIRE,+1
		dc.b	TASK_ACC,-52
		dc.b	TASK_GOTO,LEVEL_MAX
		dc.b	TASK_MOVE,16,-14
		dc.b	TASK_WAIT,70
		dc.b	TASK_FIRE,-1
		dc.b	TASK_ACC,0
		dc.b	TASK_WAITMOVE
		dc.b	TASK_FALL
; ==========================================================================
.Loop		dc.b	TASK_GOSUB,.Jump_R_to_L-*
		dc.b	TASK_GOSUB,.Jump_L_to_R-*
		dc.b	TASK_GOSUB,.Jump_R_to_L-*
		dc.b	TASK_GOSUB,.Jump_only-*
		dc.b	TASK_GOSUB,.Play_Hydraulik-*
		dc.b	TASK_GOSUB,.Fly__L_to_R-*
		dc.b	TASK_GOSUB,.Fly__R_to_L-*
		dc.b	TASK_GOSUB,.Fly__L_to_R-*
		dc.b	TASK_GOSUB,.Jump_only-*
		dc.b	TASK_GOSUB,.Play_Hydraulik-*
		dc.b	TASK_BRANCH,.Loop-*
; ==========================================================================
.Jump_only	dc.b	TASK_JUMP,-60
		dc.b	TASK_GOTO,LEVEL_MAX
		dc.b	TASK_FALL
		dc.b	TASK_JUMP,-60
		dc.b	TASK_GOTO,LEVEL_MAX
		dc.b	TASK_FALL
		dc.b	TASK_JUMP,-60
		dc.b	TASK_GOTO,LEVEL_MAX
		dc.b	TASK_FALL
		dc.b	TASK_RETURN
; ==========================================================================
.Jump_R_to_L	dc.b	TASK_JUMP,-64
		dc.b	TASK_GOTO,LEVEL_MAX
		dc.b	TASK_MOVE,96,-22
		dc.b	TASK_FALL
		dc.b	TASK_RETURN
; ==========================================================================
.Jump_L_to_R	dc.b	TASK_JUMP,-64
		dc.b	TASK_GOTO,LEVEL_MAX
		dc.b	TASK_MOVE,96,+22
		dc.b	TASK_FALL
		dc.b	TASK_RETURN
; ==========================================================================
.Fly__L_to_R	dc.b	TASK_FIRE,+1
		dc.b	TASK_ACC,-52
		dc.b	TASK_GOTO,LEVEL_MAX
		dc.b	TASK_WAIT,150
		dc.b	TASK_AUTO,50
		dc.b	TASK_MOVE,32,+22
		dc.b	TASK_GOTO,LEVEL_MAX
		dc.b	TASK_WAITMOVE
		dc.b	TASK_FIRE,-1
		dc.b	TASK_AUTO,0
		dc.b	TASK_FALL
		dc.b	TASK_RETURN
; ==========================================================================
.Fly__R_to_L	dc.b	TASK_FIRE,+1
		dc.b	TASK_ACC,-52
		dc.b	TASK_GOTO,LEVEL_MAX
		dc.b	TASK_WAIT,150
		dc.b	TASK_AUTO,50
		dc.b	TASK_MOVE,32,-22
		dc.b	TASK_GOTO,LEVEL_MAX
		dc.b	TASK_WAITMOVE
		dc.b	TASK_FIRE,-1
		dc.b	TASK_AUTO,0
		dc.b	TASK_FALL
		dc.b	TASK_RETURN
; ==========================================================================
.Play_Hydraulik	dc.b	TASK_POSSIBLE,1
		dc.b	TASK_WAIT,50
		dc.b	TASK_GOTO,LEVEL_MIN
		dc.b	TASK_TABLE,0,3
		dc.b	TASK_GOTO,LEVEL_MAX
		dc.b	TASK_WAIT,100
		dc.b	TASK_POSSIBLE,0
		dc.b	TASK_RETURN
		even

; ==========================================================================

Flame_Table_Gegner1	dc.b	64,42,10,10,+5*BYTE
		dc.b	70,36,06,08,+5*BYTE
		dc.b	64,42,08,10,+5*BYTE
		dc.b	64,42,12,10,+5*BYTE
		dc.b	58,36,06,08,+5*BYTE
		dc.b	64,42,12,10,-5*5*BYTE
		even

; ==========================================================================

Move_Tabelle_List	dc.l	Move_Tabelle_0-Move_Tabelle_List

; ==========================================================================

Move_Tabelle_0	dc.b	00,00,01,01,02,03,05,06
		dc.b	07,08,09,10,11,13,14,14
		dc.b	15,15,16,15,15,14,14,13
		dc.b	12,10,09,08,06,05,04,02
		dc.b	01,01,00,00,-1
		even

; ==========================================================================
;
; Verwaltungs-Routine fr den Springer
;
; ==========================================================================

		;Bumper simulieren (nicht mehr durchfallen!)
Gegner1_Routine	lea	(a6),a2
		cmp	#FLIEGEN,TEMET_Status(a2)
		bne.s	.no_bump
		move.w	TEMET_Y_Position(a2),d0
		cmp.w	#520-32,d0
		blt.s	.no_bump
		move	#FALLEN,TEMET_Status(a2)

		;Hole Zeiger auf Jump-Struktur
.no_bump	lea	Jump_Struktur,a3

		;Stachel Ist/Soll annhern
		move	Jump_Stachel_PosI(a3),d0
		cmp	Jump_Stachel_PosS(a3),d0
		beq	.Stachel_Ok
		blo	.Stachel_Add
		subq	#1,Jump_Stachel_PosI(a3)
		bra	.Stachel_Ok
.Stachel_Add	addq	#1,Jump_Stachel_PosI(a3)

		;Welchen Task ausfhren ???
.Stachel_Ok	move.l	Jump_Task_Zeiger(a3),a1
		add	Jump_Offset(a3),a1
		move.b	(a1),d0
		ext	d0
		move	d0,Jump_Task(a3)
		cmp	#TASK_FALL,d0
		beq	.Fall
		cmp	#TASK_GOTO,d0
		beq	.Goto
		cmp	#TASK_WAIT,d0
		beq	.Wait
		cmp	#TASK_BRANCH,d0
		beq	.Branch
		cmp	#TASK_TABLE,d0
		beq	.Table
		cmp	#TASK_FIRE,d0
		beq	.Fire
		cmp	#TASK_ACC,d0
		beq	.Acc
		cmp	#TASK_AUTO,d0
		beq	.Auto
		cmp	#TASK_MOVE,d0
		beq	.Move
		cmp	#TASK_GOSUB,d0
		beq	.Gosub
		cmp	#TASK_RETURN,d0
		beq	.Return
		cmp	#TASK_JUMP,d0
		beq	.Jump
		cmp	#TASK_WAITMOVE,d0
		beq	.WaitMove
		cmp	#TASK_POSSIBLE,d0
		bne	.Fall

		; ===========================
		; TREFFEN ENABLE/DISABLE
		; ===========================

.Possible		clr	Jump_Stachel_PosS(a3)
		moveq	#0,d0
		move.b	BYTE(a1),d0
		move	d0,Jump_Hit_Possible(a3)
		beq	.Possible_Ok
		move	#30,Jump_Stachel_PosS(a3)
.Possible_Ok	addq	#2*BYTE,Jump_Offset(a3)
		moveq	#1,d0
		jsr	TFMX+16
		bra	.Fall

		; ===========================
		; GEGNER WARTET
		; ===========================

.WaitMove		tst	Jump_Moving_Flag(a3)
		bne	.Fall
		addq	#BYTE,Jump_Offset(a3)
		bra	.Fall

		; ===========================
		; GEGNER HPFT
		; ===========================

.Jump		tst	Jump_Boost_Flag(a3)
		bne	.Fall
		move.b	BYTE(a1),d0
		ext	d0
		asl	#5,d0
		move	d0,Jump_Y_Speed(a3)
		move	#1,Jump_Jump_Flag(a3)
		addq	#2*BYTE,Jump_Offset(a3)
		moveq	#25,d0
		jsr	TFMX+16
		bra	.Fall

		; ===========================
		; RETURN
		; ===========================

.Return		moveq	#0,d0
		move.l	Jump_Stack_Zeiger(a3),a2
		addq.l	#BYTE,Jump_Stack_Zeiger(a3)
		move.b	(a2),d0
		move	d0,Jump_Offset(a3)
		bra	.Fall

		; ===========================
		; GOSUB
		; ===========================

.Gosub		lea	2*BYTE(a1),a0
		move.l	a0,d0
		sub.l	Jump_Task_Zeiger(a3),d0
		subq.l	#BYTE,Jump_Stack_Zeiger(a3)
		move.l	Jump_Stack_Zeiger(a3),a2
		move.b	d0,(a2)
		bra	.Branch

		; ===========================
		; GEGNER LINKS/RECHTS BEWEGEN
		; ===========================

.Move		tst	Jump_Boost_Flag(a3)
		bne	.Fall
		moveq	#0,d0
		move.b	1*BYTE(a1),d0
		move	Jump_X_Position(a3),d2
		move	d2,Jump_Moving_Source(a3)
		move.b	2*BYTE(a1),d1
		ext	d1
		bpl	.Move_Acc_Ok
		neg	d0
.Move_Acc_Ok	asl	#4,d1
		add	d1,d2
		move	d2,Jump_Moving_Target(a3)
		move	d0,Jump_Moving_Acc(a3)
		move	#1,Jump_Moving_Flag(a3)
		addq	#3*BYTE,Jump_Offset(a3)
		bra	.Fall

		; ====================
		; AUTOPILOT ANSCHALTEN
		; ====================

.Auto		moveq	#0,d0
		move.b	BYTE(a1),d0
		beq	.Auto_off
		move	#1,Jump_Auto_Flag(a3)
		move	d0,Jump_Auto_Height(a3)
		addq	#2*BYTE,Jump_Offset(a3)
		bra	.Fall
.Auto_off		clr	Jump_Auto_Flag(a3)
		clr	Jump_Auto_Height(a3)
		clr	Jump_Y_Acc(a3)
		clr	Jump_Auto_Timer(a3)
		move	#-1,Jump_Flame_Flag(a3)
		addq	#2*BYTE,Jump_Offset(a3)
		bra	.Fall

		; =====================
		; BESCHLEUNIGUNG SETZEN
		; =====================

.Acc		move.b	BYTE(a1),d0
		ext	d0
		move	d0,Jump_Y_Acc(a3)
		addq	#2*BYTE,Jump_Offset(a3)
		bra	.Fall

		; ====================================
		; HABEN SIE FEUER? - ABER SICHER DOCH!
		; ====================================

.Fire		tst	Jump_Boost_Flag(a3)
		bne	.Fall
		move.b	BYTE(a1),d0
		ext	d0
		move	d0,Jump_Flame_Flag(a3)
		addq	#2*BYTE,Jump_Offset(a3)
		bra	.Fall

		; ==================================
		; GEGNER BEREITET SICH VOR (OBACHT!)
		; ==================================

		;Gegner bewegt sich nach Tabelle
.Table		tst	Jump_Move_Flag(a3)
		bne	.Move_Init_Ok
		moveq	#0,d0
		move.b	2*BYTE(a1),d0
		move	d0,Jump_Move_Timer(a3)
		move	#1,Jump_Move_Flag(a3)
		clr	Jump_Move_Offset(a3)
.Move_Init_Ok	lea	Move_Tabelle_List,a0
		moveq	#0,d0
		move.b	1*BYTE(a1),d0
		lsl	#2,d0
		add.l	(a0,d0.w),a0
		add	Jump_Move_Offset(a3),a0
		move.b	(a0),d0
		bpl	.Level_Ok2
		clr	Jump_Move_Offset(a3)
		tst	Jump_Boost_Flag(a3)
		bne	.Keine_Kollision
		subq	#1,Jump_Move_Timer(a3)
		bne	.Move_Init_Ok
		clr	Jump_Move_Flag(a3)
		addq	#3*BYTE,Jump_Offset(a3)
		bra	.Keine_Kollision
.Level_Ok2	tst	d0
		beq	.Sound
		cmp	#16,d0
		bne	.No_Sound
.Sound		move.l	d0,-(sp)
		moveq	#26,d0
		jsr	TFMX+16
		move.l	(sp)+,d0
.No_Sound		move	d0,Jump_Move_Pos(a3)
		add	#LEVEL_MIN,d0
		move	d0,Jump_Level(a3)
		addq	#BYTE,Jump_Move_Offset(a3)
		bra	.Keine_Kollision

		; ========================
		; LOGIK BRANCHT
		; ========================

		;Offset lesen und interpretieren
.Branch		move.b	BYTE(a1),d0
		ext	d0
		add	d0,Jump_Offset(a3)
		bra	.Fall

		; ========================
		; GEGNER SCHLFT
		; ========================

		;Verzgerung abwarten
.Wait		tst	Jump_Timer(a3)
		bne	.Wait_aktiv
		moveq	#0,d0
		move.b	BYTE(a1),d0
		move	d0,Jump_Timer(a3)
		bra	.Fall
.Wait_aktiv	subq	#1,Jump_Timer(a3)
		bne	.Fall
		addq	#2*BYTE,Jump_Offset(a3)
		bra	.Fall

		; ========================
		; HYDRAULIK ARBEITET
		; ========================

		;Gewnschtes Level ansteuern
.Goto		moveq	#0,d0
		move.b	BYTE(a1),d0
		cmp	Jump_Level(a3),d0
		beq	.Target_reached
		bhi	.Stand_Up
.Sit_Down		subq	#1,Jump_Level(a3)
		addq	#1,Jump_Y_Position(a3)
		bra	.Fall
.Stand_Up		addq	#1,Jump_Level(a3)
		subq	#1,Jump_Y_Position(a3)
		bra	.Fall
.Target_reached	addq	#2*BYTE,Jump_Offset(a3)
		bra	.Fall

		; ========================
		; GEGNER FLLT
		; ========================

		;Geschwidkeit whrend Sprung verwalten
.Fall		tst	Jump_Jump_Flag(a3)
		beq	.No_Jump
		move	Jump_Y_Speed(a3),d0
		asr	#8,d0
		sub	d0,Jump_Y_Speed(a3)
		bne	.No_Jump
		clr	Jump_Jump_Flag(a3)

		;Horizontale Bewegung ermglichen
.No_Jump		tst	Jump_Moving_Flag(a3)
		beq	.Autopilot
		move	Jump_Moving_Target(a3),d1
		sub	Jump_Moving_Source(a3),d1
		asr	#1,d1
		add	Jump_Moving_Source(a3),d1
		move	Jump_Moving_Acc(a3),Jump_X_Acc(a3)
		bpl	.Move_Right
.Move_Left	cmp	Jump_X_Position(a3),d1
		blo	.Move_Left2
		tst	Jump_X_Acc(a3)
		bpl	.Move_Left2
		neg	Jump_X_Acc(a3)
.Move_Left2	move	Jump_Moving_Target(a3),d0
		move	d0,d1
		sub	Jump_X_Position(a3),d1
		bpl	.Left_Positiv
		neg	d1
.Left_Positiv	cmp	#32,d1
		bhi	.Autopilot
		move	Jump_Moving_Acc(a3),d2
		asr	#1,d2
		add	d2,Jump_X_Acc(a3)
		cmp	#16,d1
		bhi	.Autopilot
		move	Jump_Moving_Acc(a3),d2
		asr	#2,d2
		add	d2,Jump_X_Acc(a3)
		cmp	#2,d1
		bhi	.Autopilot
		move	d0,Jump_X_Position(a3)
.Move_off		clr	Jump_Moving_Flag(a3)
		clr	Jump_X_Acc(a3)
		clr	Jump_X_Speed(a3)
		bra	.Autopilot
.Move_Right	cmp	Jump_X_Position(a3),d1
		bhi	.Move_Right2
		tst	Jump_X_Acc(a3)
		bmi	.Move_Right2
		neg	Jump_X_Acc(a3)
.Move_Right2	bra	.Move_Left2

		; -=*> Autopilot <*=-
.Autopilot	tst	Jump_Auto_Timer(a3)
		beq	.No_Auto_Action
		move	#-256,Jump_Y_Acc(a3)
		move	#1,Jump_Flame_Force(a3)
		movem	Jump_X_Position(a3),d0/d1
		add	Jump_Auto_Height(a3),d1
		add	#116,d1
		jsr	Get_Block_Bits
		swap	d0
		and	#(1<<SCR_KOLLISION_BIT)!(1<<SCR_EFFECT_BIT),d0
		beq	.No_Auto
		clr	Jump_Auto_Timer(a3)
		bra	.No_Auto
.No_Auto_Action	tst	Jump_Auto_Flag(a3)
		beq	.No_Auto
		clr	Jump_Y_Acc(a3)
		movem	Jump_X_Position(a3),d0/d1
		add	Jump_Auto_Height(a3),d1
		add	#100,d1
		jsr	Get_Block_Bits
		swap	d0
		and	#(1<<SCR_KOLLISION_BIT)!(1<<SCR_EFFECT_BIT),d0
		beq	.No_Auto
		move	#1,Jump_Auto_Timer(a3)

		;Fliekommawerte berechnen
.No_Auto		move	Jump_X_Acc(a3),d0
		add	d0,Jump_X_Speed(a3)
		move	Jump_X_Speed(a3),d0
		add	d0,Jump_X_Float(a3)
		move.b	Jump_X_Float(a3),d0
		ext	d0
		add	d0,Jump_X_Position(a3)
		clr.b	Jump_X_Float(a3)
		move	Jump_Y_Acc(a3),d0
		add	Jump_Gravitation(a3),d0
		add	d0,Jump_Y_Speed(a3)
		move	Jump_Y_Speed(a3),d0
		add	d0,Jump_Y_Float(a3)
		move.b	Jump_Y_Float(a3),d0
		ext	d0
		add	d0,Jump_Y_Position(a3)
		clr.b	Jump_Y_Float(a3)

		;Beine auf Boden ???
		movem	Jump_X_Position(a3),d0/d1
		add	Jump_Level(a3),d1
		add	#32,d1
		move	d1,-(sp)
		jsr	Get_Block_Bits
		move	(sp)+,d1
		swap	d0
		btst	#SCR_KOLLISION_BIT,d0
		beq	.Keine_Kollision

		;Ja, also abfedern
		move	Jump_Y_Speed(a3),d0
		asr	#1,d0
		sub	d0,Jump_Y_Speed(a3)
		move	Jump_Level(a3),d0
		and	#%1111,d1
		sub	d1,d0
		cmp	#LEVEL_MIN,d0
		bhs	.Level_Ok
		cmp	#TASK_FALL,Jump_Task(a3)
		bne	.No_Wait_Ground
		addq	#BYTE,Jump_Offset(a3)
.No_Wait_Ground	clr	Jump_Y_Acc(a3)
		clr	Jump_Y_Speed(a3)
		clr	Jump_Y_Float(a3)
		sub	#LEVEL_MIN,d0
		neg	d0
		sub	d0,Jump_Y_Position(a3)
		moveq	#LEVEL_MIN,d0
.Level_Ok		move	d0,Jump_Level(a3)

		;Endgltige Position festlegen
.Keine_Kollision	movem	Jump_X_Position(a3),d0/d1
		sub	Jump_Move_Pos(a3),d1
		movem	d0/d1,Bob_X_Position(a4)

		;Explosionen ???
		tst	Jump_Boost_Flag(a3)
		beq	.No_Expl
		subq	#1,Jump_Boost_Timer(a3)
		bpl	.Keine_Flamme
		move.l	Jump_Boost_Zeiger(a3),a1
		moveq	#11,d0
		jsr	TFMX+16
		moveq	#0,d0
		move.b	(a1)+,d0
		moveq	#0,d1
		move.b	(a1)+,d1
		moveq	#0,d2
		move.b	(a1)+,d2
		move	d2,Jump_Boost_Timer(a3)
		move.b	(a1),d2
		ext	d2
		ext.l	d2
		add.l	d2,Jump_Boost_Zeiger(a3)
		bra	.Enter_Flame

		;Neue Flammen ???
.No_Expl		subq	#1,Jump_Flame_Timer(a3)
		bpl	.Keine_Flamme
		move.l	Jump_Flame_Zeiger(a3),a1
		moveq	#0,d0
		move.b	(a1)+,d0
		moveq	#0,d1
		move.b	(a1)+,d1
		moveq	#0,d2
		move.b	(a1)+,d2
		move	d2,Jump_Flame_Timer(a3)
		moveq	#0,d3
		move.b	(a1)+,d3
		lsl	#6,d3
		move.b	(a1),d2
		ext	d2
		ext.l	d2
		add.l	d2,Jump_Flame_Zeiger(a3)

		;Ja, also eintragen
		tst	Jump_Flame_Force(a3)
		beq	.No_Force
		move	#1,Jump_Flame_Flag(a3)
		subq	#1,Jump_Flame_Force(a3)
		bne	.No_Force
		clr	Jump_Flame_Flag(a3)
.No_Force		tst	Jump_Flame_Flag(a3)
		bmi	.Keine_Flamme
.Enter_Flame	add	Bob_X_Position(a4),d0
		add	Bob_Y_Position(a4),d1
		lea	Flame1_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Search	tst	Flame_Used(a1)
		bne	.Used
		move	#1,Flame_Used(a1)
		movem	d0/d1,Flame_X_Position(a1)
		clr	Flame_Anim(a1)
		move	d3,Flame_Speed(a1)
		clr	Flame_Float(a1)
		move	#3,Flame_Timer(a1)
		moveq	#2,d0
		jsr	TFMX+16
		bra	.Keine_Flamme
.Used		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Search

		;Handle Flammen
.Keine_Flamme	lea	Flame1_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Handle	tst	Flame_Used(a1)
		beq	.No_Flame
		tst	Jump_Boost_Flag(a3)
		beq	.No_Handle_Expl
		subq	#1,Flame_Timer(a1)
		bpl	.No_Flame
		move	#3,Flame_Timer(a1)
		addq	#1,Flame_Anim(a1)
		cmp	#5,Flame_Anim(a1)
		blo	.No_Flame
		clr	Flame_Used(a1)
		bra	.No_Flame
.No_Handle_Expl	move	Flame_Speed(a1),d0
		add	d0,Flame_Float(a1)
		move.b	Flame_Float(a1),d0
		ext	d0
		add	d0,Flame_Y_Position(a1)
		clr.b	Flame_Float(a1)
		sub	#16,Flame_Speed(a1)
		bpl	.Speed_Ok
		clr	Flame_Speed(a1)
.Speed_Ok		subq	#1,Flame_Timer(a1)
		bpl	.No_Flame
		move	#3,Flame_Timer(a1)
		addq	#1,Flame_Anim(a1)
		cmp	#8,Flame_Anim(a1)
		blo	.No_Flame
		clr	Flame_Used(a1)
.No_Flame		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Handle

		;Flimmern wenn getroffen
		tst	Jump_Hit_Timer(a3)
		beq	.Do_Display
		subq	#1,Jump_Hit_Timer(a3)
		move	Jump_Hit_Timer(a3),d0
		and	#1,d0
		beq	.Test_Nutz_Hit

		; ========================
		; GEGNER-SIGELS DARSTELLEN
		; ========================

.Do_Display	tst	Jump_Boost_Flag(a3)
		beq	.Normal_Display
		bsr	Display_Jump_Flame
		bsr	Display_Jump_Gegner
		bsr	Display_Jump_Add
		bra	.Test_Nutz_Hit
.Normal_Display	bsr	Display_Jump_Gegner
		bsr	Display_Jump_Flame
		bsr	Display_Jump_Add
.Test_Nutz_Hit	bsr	Display_Jump_Stach

		;Wurde Nutz getroffen ???
		tst	Jump_Hit_Timer(a3)
		bne	.Done
		move	Jump_Level(a3),d0
		add	#90-LEVEL_MIN,d0
		move	d0,Bob_Height(a4)
		move	#160,Bob_Width(a4)

		tst.w	Jump_Boost_Flag(a3)
		bne.s	.No_Scream

		lea	(a6),a2
		moveq	#0,d0
		move.b	TEMET_ANZ_HitPoints(a2),d0
		move	d0,-(sp)
		jsr	Test_TEMET_Hit_St
		move	(sp)+,d0
		cmp.b	TEMET_ANZ_HitPoints(a2),d0
		bls	.No_Scream

		move.w	TEMET_Y_Position(a2),d0
		add.w	#32,d0
		cmp.w	Jump_Y_Position(a3),d0
		blt.s	.Do_Scream

	;Gegner von den Spitzen hochschleudern lassen!

		lea	(a6),a2
		clr.w	TEMET_Speed_Y(a2)
		move.b	#-6,TEMET_Speed_Y(a2)
		move	#-1,TEMET_Fly_Up_Val_Y(a2)
		move	#-1,TEMET_Fly_Up_Val_X(a2)
		move	#FALLEN,TEMET_Status(a2)
		bra.s	.No_Scream
.Do_Scream
		moveq	#23,d0
		jsr	TFMX+16

		;Exit ???
.No_Scream	tst	Jump_Exit_Timer(a3)
		beq	.No_Exit_Timer
		subq	#1,Jump_Exit_Timer(a3)
		bne	.No_Exit_Timer
		move.b	#1,Finish(a6)
		rts

		;Hat Nutz getroffen ???
.No_Exit_Timer	tst	Jump_Boost_Flag(a3)
		bne	.Done
		tst	Jump_Hit_Possible(a3)
		beq	.Done
		lea	WorkRam,a2
		jsr	KollTopBobTest
		tst	d7
		bmi	.Done
		moveq	#9,d0
		jsr	TFMX+16
		jsr	Make_Bump
		move	#2*50,Jump_Hit_Timer(a3)
		addq	#1,Jump_Hit_Zhler(a3)
		cmp	#HITS_JUMPER,Jump_Hit_Zhler(a3)
		blo	.Done
		move	#4*50,Jump_Exit_Timer(a3)
		move	#1,Jump_Boost_Flag(a3)
.Done		rts

; ==========================================================================
;
; Stacheln darstellen
;
; a4 = Zeiger auf Bob-Eintrag
;
; ==========================================================================

		;Display Stacheln
Display_Jump_Stach	move	Jump_Stachel_PosI(a3),d0
		move	d0,d1
		lsr	#1,d1
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Stachel_Sigel,a0
		add	#20,Bob_X_Position(a4)
		add	#5,Bob_Y_Position(a4)
		add	d0,Bob_X_Position(a4)
		add	d1,Bob_Y_Position(a4)
		movem.l	d0/d1/d3/a0,-(sp)
		jsr	Show_Simple_Mickey
		movem.l	(sp)+,d0/d1/d3/a0
		moveq	#1,d2
		add	#72,Bob_X_Position(a4)
		sub	d0,Bob_X_Position(a4)
		sub	d0,Bob_X_Position(a4)
		movem.l	d0/d1/d3/a0,-(sp)
		jsr	Show_Big_Simple_Object
		movem.l	(sp)+,d0/d1/d3/a0
		add	d0,Bob_X_Position(a4)
		sub	d1,Bob_Y_Position(a4)
		sub	#20+72,Bob_X_Position(a4)
		sub	#5,Bob_Y_Position(a4)
		rts

; ==========================================================================
;
; Gegner darstellen
;
; a4 = Zeiger auf Bob-Eintrag
;
; ==========================================================================

		;Display Gegner
Display_Jump_Gegner	moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		move.l	Bob_SigelInfo(a4),a0
		jsr	Show_Simple_Mickey
		add	#80,Bob_X_Position(a4)
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		move.l	Bob_SigelInfo(a4),a0
		jsr	Show_Big_Simple_Object
		sub	#80,Bob_X_Position(a4)
		rts

; ==========================================================================
;
; Klappen/Fe darstellen
;
; a4 = Zeiger auf Bob-Eintrag
;
; ==========================================================================

		;Display Klappen
Display_Jump_Add	movem	Bob_X_Position(a4),d0/d1
		add	#20,Bob_X_Position(a4)
		add	#52,Bob_Y_Position(a4)
		move	Jump_Level(a3),d2
		sub	#LEVEL_MAX,d2
		neg	d2
		lsr	#2,d2
		sub	d2,Bob_Y_Position(a4)
		lsr	#1,d2
		sub	d2,Bob_X_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Klappe1_Sigel,a0
		movem	d0/d1,-(sp)
		jsr	Show_Simple_Mickey
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		add	#71,Bob_X_Position(a4)
		add	#60,Bob_Y_Position(a4)
		move	Jump_Level(a3),d2
		sub	#LEVEL_MAX,d2
		neg	d2
		lsr	#2,d2
		sub	d2,Bob_Y_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Klappe2_Sigel,a0
		movem	d0/d1,-(sp)
		jsr	Show_Simple_Mickey
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		add	#117,Bob_X_Position(a4)
		add	#52,Bob_Y_Position(a4)
		move	Jump_Level(a3),d2
		sub	#LEVEL_MAX,d2
		neg	d2
		lsr	#2,d2
		sub	d2,Bob_Y_Position(a4)
		lsr	#1,d2
		add	d2,Bob_X_Position(a4)
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Klappe1_Sigel,a0
		movem	d0/d1,-(sp)
		jsr	Show_Big_Simple_Object
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)

		;Display Fe
		movem	Bob_X_Position(a4),d0/d1
		addq	#7,Bob_X_Position(a4)
		move	Jump_Level(a3),d2
		add	d2,Bob_Y_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Fu1_Sigel,a0
		movem	d0/d1,-(sp)
		jsr	Show_Simple_Mickey
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		add	#64,Bob_X_Position(a4)
		move	Jump_Level(a3),d2
		add	d2,Bob_Y_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Fu2_Sigel,a0
		movem	d0/d1,-(sp)
		jsr	Show_Simple_Mickey
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		add	#122,Bob_X_Position(a4)
		move	Jump_Level(a3),d2
		add	d2,Bob_Y_Position(a4)
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Fu1_Sigel,a0
		movem	d0/d1,-(sp)
		jsr	Show_Big_Simple_Object
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		rts

; ==========================================================================
;
; Flammen/Explosionen darstellen
;
; a4 = Zeiger auf Bob-Eintrag
;
; ==========================================================================

		;Display Flammen
Display_Jump_Flame	movem	Bob_X_Position(a4),d0/d1
		movem	d0/d1,-(sp)
		lea	Flame1_Struktur,a0
		moveq	#FLAME_MAX-1,d7
.Loop_Flame	tst	Flame_Used(a0)
		beq	.Unused
		movem	Flame_X_Position(a0),d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		movem.l	d7/a0-a3,-(sp)
		tst	Jump_Boost_Flag(a3)
		beq	.Flame
		addq	#1,Flame_Frame(a0)
		and	#%11,Flame_Frame(a0)
		move	Flame_Frame(a0),d7
		add	#08,Bob_X_Position(a4)
		lsr	#1,d7
		bcc	.Expl_Right
		sub	#16,Bob_X_Position(a4)
.Expl_Right	add	#08,Bob_Y_Position(a4)
		lsr	#1,d7
		bcc	.Expl_Down
		sub	#16,Bob_Y_Position(a4)
.Expl_Down	move	Flame_Anim(a0),d7
		lsl.w	#4,d7
		lea	Expl_Sigel_List,a0
		add	d7,a0
		jsr	Show_Simple_Mickey
		bra	.Ok
.Flame		eor	#1,Flame_Frame(a0)
		beq	.No_Interlace
		add	#22,Bob_Y_Position(a4)
.No_Interlace	move	Flame_Anim(a0),d7
		lsl	#4,d7
		lea	Flame_Sigel_List,a0
		add	d7,a0
		jsr	Show_Simple_Mickey
.Ok		movem.l	(sp)+,d7/a0-a3
.Unused		add	#FLAME_SIZEOF,a0
		dbf	d7,.Loop_Flame
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		rts

; ==========================================================================
;
; Mickey-Bumper (Stachel-Gegner)
;
; ==========================================================================

Init_MiBumper	move.b	#-8,GBumper_Bump_Speed(a4)
		move.b	#10,GBumper_Bump_Time(a4)
		and	#$fff0,Bob_X_Position(a4)
		and	#$fff0,Bob_Y_Position(a4)
		subq.w	#8,Bob_Y_Position(a4)
		move.l	#Bumper_Rout_Gl,Bob_Routine(a4)
		move.l	#Show_Mickey_Object,GBumper_Show_Rout(a4)
		move.l	#MiBumper_Work_Anm,GBumper_Work_Anim(a4)
		rts

; ==========================================================================
;
; Mickey-Bumper bei Wasser-Endgegner initialiseren
;
; ==========================================================================

Init_WMiBumper	move.b	#-8,GBumper_Bump_Speed(a4)
		move.b	#10,GBumper_Bump_Time(a4)
		and	#$fff0,Bob_X_Position(a4)
		and	#$fff0,Bob_Y_Position(a4)
		sub	#23,Bob_Y_Position(a4)
		move.l	#Bumper_Rout_Gl,Bob_Routine(a4)
		move.l	#Show_Mickey_Object,GBumper_Show_Rout(a4)
		move.l	#WMiBumper_Work_Anm,GBumper_Work_Anim(a4)
		rts

; ==========================================================================
;
; Mickey-Bumper bei End-Endgegner initialiseren
;
; ==========================================================================
Init_EMiBumper	move.b	#-8,GBumper_Bump_Speed(a4)
		move.b	#10,GBumper_Bump_Time(a4)
		and	#$fff0,Bob_X_Position(a4)
		and	#$fff0,Bob_Y_Position(a4)
		sub	#23,Bob_Y_Position(a4)
		move.l	#EMi_Bumer_Routine,Bob_Routine(a4)
		move.l	#Show_Mickey_Object,GBumper_Show_Rout(a4)
		move.l	#EMiBumper_Work_Anm,GBumper_Work_Anim(a4)
		rts

; ==========================================================================

EMi_Bumer_Routine	lea	Lemming_Struktur,a0
		tst	Lemming_BumpFlag(a0)
		beq	.Done
		clr	Lemming_BumpFlag(a0)
		move.l	GBumper_Work_Anim(a4),Bob_Next_Anim(a4)
		jsr	Get_Next_Bob_Frame
		clr.w	Bob_Anim_Delay(a4)
		move	#1,Bob_Anim_Delay_Init(a4)
		move.b	GBumper_Bump_Time(a4),GBumper_Work_Time(a4)
		neg.b	GBumper_Work_Time(a4)
.Done		jmp	Bumper_Rout_Gl

; ==========================================================================
;
; TIMET - GUMMILIANE
;
; a0 = Zeiger auf Lianen-Struktur
;
; ==========================================================================

		;Zeiger auf Lianen-Struktur
		;und Anzahl der Punkte holen
Bewege_Liane	lea	Liane_Struktur,a0
		move	(a0)+,d7

		;Multiplikationsfaktoren fr Beschleunigung
		moveq	#BESCHLEUNIGUNG_HIN,d4
		moveq	#BESCHLEUNIGUNG_WEG,d5

		;Soll- und Ist-Gravitationen annhern
.Loop		move	Liane_Y_Gravitation_Ist(a0),d0
		cmp	Liane_Y_Gravitation_Soll(a0),d0
		beq	.Gravitation_Ok
		blt	.Gravitation_Add
.Gravitation_Sub	sub	#10,Liane_Y_Gravitation_Ist(a0)
		bra	.Gravitation_Ok
.Gravitation_Add	add	#10,Liane_Y_Gravitation_Ist(a0)

		;Um den Mittelpunkt zwischen zwei Punkten
		;bestimmen zu knnen, mu der erste und der
		;letzte Punkt ausgelassen werden.
.Gravitation_Ok	tst	Liane_Begrenzung(a0)
		beq	.Nchster_Punkt
		tst	Liane_Begrenzung(a0)
		bmi	.Nchster_Punkt

		;Der nchste Bezugspunkt des letzten Punktes
		;hat die gleichen Koordinaten, wie der vorhergehende!
		tst	Liane_Begrenzung+LIANE_ENTRY_LENGTH(a0)
		bne	.Normaler_Punkt
		move	Liane_X_Position-LIANE_ENTRY_LENGTH(a0),Liane_X_Position+LIANE_ENTRY_LENGTH(a0)
		move	Liane_Y_Position-LIANE_ENTRY_LENGTH(a0),Liane_Y_Position+LIANE_ENTRY_LENGTH(a0)

		;Mittelpunkt zwischen vorherigem und
		;nachfolgendem Punkt berechnen
.Normaler_Punkt	move	Liane_X_Position+LIANE_ENTRY_LENGTH(a0),d0
		sub	Liane_X_Position-LIANE_ENTRY_LENGTH(a0),d0
		asr	#1,d0
		add	Liane_X_Position-LIANE_ENTRY_LENGTH(a0),d0
		move	Liane_Y_Position+LIANE_ENTRY_LENGTH(a0),d1
		sub	Liane_Y_Position-LIANE_ENTRY_LENGTH(a0),d1
		asr	#1,d1
		add	Liane_Y_Position-LIANE_ENTRY_LENGTH(a0),d1

		;X/Y-Abstand der benachbarten Punkte berechnen
		moveq	#0,d2
		move	Liane_X_Position+LIANE_ENTRY_LENGTH(a0),d2
		sub	Liane_X_Position-LIANE_ENTRY_LENGTH(a0),d2
		bpl	.Abstand_X_Ok
		neg	d2
.Abstand_X_Ok	lsr	#3,d2
		bne	.Abstand_X_Ok2
		moveq	#1,d2
.Abstand_X_Ok2	moveq	#0,d3
		move	Liane_Y_Position+LIANE_ENTRY_LENGTH(a0),d3
		sub	Liane_Y_Position-LIANE_ENTRY_LENGTH(a0),d3
		bpl	.Abstand_Y_Ok
		neg	d3
.Abstand_Y_Ok	lsr	#3,d3
		bne	.Berechne_Abstand
		moveq	#1,d3

		;Horizontalen und vertikalen Abstand
		;zwischen Ist- und Soll-Punkt berechnen
.Berechne_Abstand	sub	Liane_X_Position(a0),d0
		sub	Liane_Y_Position(a0),d1

		;Bestimme horizontale Beschleunigung
.Acceleration_X	tst	d0
		bpl	.Test_Acc_X
		tst	Liane_X_Geschwindigkeit(a0)
		bmi	.Hin_X
		muls	d5,d0
		muls	d3,d0
		bra	.Acceleration_Y
.Test_Acc_X	tst	Liane_X_Geschwindigkeit(a0)
		bpl	.Hin_X
		muls	d5,d0
		muls	d3,d0
		bra	.Acceleration_Y
.Hin_X		muls	d4,d0
		muls	d3,d0

		;Bestimme vertikale Beschleunigung
.Acceleration_Y	tst	d1
		bpl	.Test_Acc_Y
		tst	Liane_Y_Geschwindigkeit(a0)
		bmi	.Hin_Y
		muls	d5,d1
		muls	d2,d1
		bra	.Acceleration_Y_Ok
.Test_Acc_Y	tst	Liane_Y_Geschwindigkeit(a0)
		bpl	.Hin_Y
		muls	d5,d1
		muls	d2,d1
		bra	.Acceleration_Y_Ok
.Hin_Y		muls	d4,d1
		muls	d2,d1

		;Setze neue Beschleunigung
.Acceleration_Y_Ok	add	Liane_X_Gravitation(a0),d0
		move	d0,Liane_X_Beschleunigung(a0)
		add	Liane_Y_Gravitation_Ist(a0),d1
		move	d1,Liane_Y_Beschleunigung(a0)

		;Beschleunigung auf Geschwindigkeit aufaddieren
		move	Liane_X_Beschleunigung(a0),d0
		add	d0,Liane_X_Geschwindigkeit(a0)
		move	Liane_Y_Beschleunigung(a0),d0
		add	d0,Liane_Y_Geschwindigkeit(a0)

		;Endgltige Fliekommawerte bestimmen
.Beschleunigung_Y	move	Liane_X_Geschwindigkeit(a0),d0
		add	d0,Liane_X_Float(a0)
		move	Liane_Y_Geschwindigkeit(a0),d0
		add	d0,Liane_Y_Float(a0)

		;Schleife ber alle Punkte der Liane
.Nchster_Punkt	add	#LIANE_ENTRY_LENGTH,a0
		dbf	d7,.Loop

		;Zeiger auf Lianen-Struktur und
		;Anzahl der Punkte holen
		lea	Liane_Struktur,a0
		move	(a0)+,d7

.Loop_Position	move.b	Liane_X_Float(a0),d0
		ext	d0
		add	d0,Liane_X_Position(a0)
		clr.b	Liane_X_Float(a0)
		move.b	Liane_Y_Float(a0),d0
		ext	d0
		add	d0,Liane_Y_Position(a0)
		clr.b	Liane_Y_Float(a0)

		;Schleife ber alle Punkte der Liane
		add	#LIANE_ENTRY_LENGTH,a0
		dbf	d7,.Loop_Position

		;und zurck
		rts

; ==========================================================================
;
; Gegner2_Routine
;
; ==========================================================================

Gegner2_Init	lea	Liane_Struktur,a0
		move	#VARIABLEN_SIZEOF-Liane_Struktur-1,d0
.Loop		clr.b	(a0)+
		dbf	d0,.Loop
		lea	Liane_Struktur,a0
		lea	Liane_Default,a1
		move	(a1)+,d0
		move	d0,(a0)+
		addq	#1,d0
		mulu	#LIANE_ENTRY_LENGTH,d0
		lsr	#1,d0
		subq	#1,d0
.Loop_Define	move	(a1)+,(a0)+
		dbf	d0,.Loop_Define
		lea	Gummi_Struktur,a0
		move	#1,Gummi_Left_Flag(a0)
		move	#240,Gummi_Saug_Min(a0)
		move	#780,Gummi_Saug_Max(a0)
		lea	Flame_Table_Start,a1
		move.l	a1,Gummi_Flame_Zeiger(a0)
		lea	Expl_Table_Gummi,a1
		move.l	a1,Gummi_Boost_Zeiger(a0)
		lea	Gegner2_Routine,a0
		move.l	a0,Bob_Routine(a4)
		move	#1300,WaterBase(a6)
		rts

; ==========================================================================

Liane_Default	dc.w	10-1
		dc.w	176,512,+000,+000,+000,+000,+000,+000,+000,+000,000,-0000,-0000,LIANE_FIX
		dc.w	208,512,-016,+000,+000,+000,+000,+000,+000,+000,000,-0400,-0400,LIANE_NORMAL
		dc.w	240,512,-031,+000,+000,+000,+000,+000,+000,+000,000,-0600,-0600,LIANE_NORMAL
		dc.w	272,512,-046,+000,+000,+000,+000,+000,+000,+000,000,-0800,-0800,LIANE_NORMAL
		dc.w	304,512,-064,-010,+000,+000,+000,+000,+000,+000,000,-1200,-1200,LIANE_NORMAL
		dc.w	336,512,+030,+000,+000,+000,+000,+000,+000,+000,000,-0800,-0800,LIANE_NORMAL
		dc.w	368,512,+020,+000,+000,+000,+000,+000,+000,+000,000,-0600,-0600,LIANE_NORMAL
		dc.w	400,512,+010,+000,+000,+000,+000,+000,+000,+000,000,-0400,-0400,LIANE_NORMAL
		dc.w	432,512,+000,+000,+000,+000,+000,+000,+000,+000,000,-0000,-0000,LIANE_FIX
		dc.w	000,512,+000,+000,+000,+000,+000,+000,+000,+000,000,-0000,-0000,LIANE_ENDE

; ==========================================================================
;
; Gegner-Routine fr Saugnapf-Gegner
;
; a4 = Zeiger auf Eintrag in der Bob-Struktur
;
; ==========================================================================

		;Handle Saugnpfe
Gegner2_Routine	lea	Gummi_Struktur,a0
		lea	WorkRam,a3
		lea	Saugnapf_PosTab,a1
		lea	Liane_Struktur+0*LIANE_ENTRY_LENGTH+WORD,a2
		moveq	#Gummi_Left_Timer,d2
		bsr	Saugnapf_setzen
		lea	Saugnapf_PosTab,a1
		lea	Liane_Struktur+8*LIANE_ENTRY_LENGTH+WORD,a2
		moveq	#Gummi_Right_Timer,d2
		bsr	Saugnapf_setzen

		;Handle Flammen
.Handle_Flammen	lea	Flame_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Handle	tst	Flame_Used(a1)
		beq	.No_Flame
		cmp	#2,Gummi_Boost_Flag(a0)
		bne	.No_Expl
		subq	#1,Flame_Timer(a1)
		bpl	.No_Flame
		move	#3,Flame_Timer(a1)
		addq	#1,Flame_Anim(a1)
		cmp	#5,Flame_Anim(a1)
		blo	.No_Flame
		clr	Flame_Used(a1)
		bra	.No_Flame
.No_Expl		move	Flame_Speed(a1),d0
		add	d0,Flame_Float(a1)
		move.b	Flame_Float(a1),d0
		ext	d0
		add	d0,Flame_Y_Position(a1)
		clr.b	Flame_Float(a1)
		sub	#16,Flame_Speed(a1)
		bpl	.Speed_Ok
		clr	Flame_Speed(a1)
.Speed_Ok		subq	#1,Flame_Timer(a1)
		bpl	.No_Flame
		move	#3,Flame_Timer(a1)
		addq	#1,Flame_Anim(a1)
		cmp	#8,Flame_Anim(a1)
		blo	.No_Flame
		clr	Flame_Used(a1)
.No_Flame		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Handle

		;Taktik frs Feuer geben
		subq	#1,Gummi_Grav_Timer(a0)
		bpl	.Beibehalten
		cmp	#HITS_GUMMI,Gummi_Hit_Zhler(a0)
		bhs	.Loslassen
		tst	Gummi_Grav_Flag(a0)
		beq	.Feuer_geben
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*4+WORD,a1
		tst	Gummi_Hit_Timer(a0)
		bne	.Loslassen
		cmp	#300,Liane_Y_Position(a1)
		blo	.Feuer_geben
.Loslassen	clr	Gummi_Grav_Flag(a0)
		move	#2*50+25,Gummi_Grav_Timer(a0)
		bra	.Beibehalten
.Feuer_geben	clr	Open_Door_But(a6)
		move	#1,Gummi_Grav_Flag(a0)
		lea	Flame_TimeTab,a1
		move	Gummi_Flame_Offset(a0),d0
		move	(a1,d0.w),d1
		bpl	.FlameTime_Ok
		clr	Gummi_Flame_Offset(a0)
		bra	.Feuer_geben
.FlameTime_Ok	addq	#WORD,Gummi_Flame_Offset(a0)
		move	d1,Gummi_Grav_Timer(a0)

		;Gravitation setzen
.Beibehalten	tst	Gummi_Boost_Flag(a0)
		bne	.Keine_Flamme
		lea	Liane_Struktur,a1
		move	(a1)+,d0
		tst	Gummi_Grav_Flag(a0)
		beq	.Keine_Gravitation
		lea	Gravitation_Tabelle,a2
.Volle_Gravitation	move	(a2)+,Liane_Y_Gravitation_Soll(a1)
		add	#LIANE_ENTRY_LENGTH,a1
		dbf	d0,.Volle_Gravitation
		bra	.Add_Flammen
.Keine_Gravitation	clr	Liane_Y_Gravitation_Ist(a1)
		clr	Liane_Y_Gravitation_Soll(a1)
		add	#LIANE_ENTRY_LENGTH,a1
		dbf	d0,.Keine_Gravitation
		bra	.Keine_Flamme

		;Neue Flammen ???
.Add_Flammen	subq	#1,Gummi_Flame_Timer(a0)
		bpl	.Keine_Flamme
		move.l	Gummi_Flame_Zeiger(a0),a1
		moveq	#0,d0
		move.b	(a1)+,d0
		moveq	#0,d1
		move.b	(a1)+,d1
		moveq	#0,d2
		move.b	(a1)+,d2
		move	d2,Gummi_Flame_Timer(a0)
		moveq	#0,d3
		move.b	(a1)+,d3
		lsl	#6,d3
		move.b	(a1),d2
		ext	d2
		ext.l	d2
		add.l	d2,Gummi_Flame_Zeiger(a0)

		;Ja, also eintragen
		lea	Liane_Struktur+4*LIANE_ENTRY_LENGTH+WORD,a1
		add	Liane_X_Position(a1),d0
		sub	#64,d0
		add	Liane_Y_Position(a1),d1
		lea	Flame_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Search	tst	Flame_Used(a1)
		bne	.Used
		move	#1,Flame_Used(a1)
		movem	d0/d1,Flame_X_Position(a1)
		clr	Flame_Anim(a1)
		move	d3,Flame_Speed(a1)
		clr	Flame_Float(a1)
		move	#3,Flame_Timer(a1)
		moveq	#2,d0
		jsr	TFMX+16
		bra	.Keine_Flamme
.Used		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Search

		;Boost-Sequenz ???
.Keine_Flamme	lea	Gummi_Struktur,a0
		move	Gummi_Boost_Flag(a0),d0
		beq	.Do_Liane
		subq	#1,d0
		beq	.Init_Boost

		;Gegner hngt schon schwer in den
		;Seilen -> Explosionen eintragen
.Enter_Expl	subq	#1,Gummi_Boost_Timer(a0)
		bpl	.Do_Liane
		move.l	Gummi_Boost_Zeiger(a0),a1
		moveq	#0,d0
		move.b	(a1)+,d0
		moveq	#0,d1
		move.b	(a1)+,d1
		moveq	#0,d2
		move.b	(a1)+,d2
		move	d2,Gummi_Boost_Timer(a0)
		move.b	(a1),d2
		ext	d2
		ext.l	d2
		add.l	d2,Gummi_Boost_Zeiger(a0)
		lea	Liane_Struktur+4*LIANE_ENTRY_LENGTH+WORD,a1
		add	Liane_X_Position(a1),d0
		sub	#64,d0
		add	Liane_Y_Position(a1),d1
		lea	Flame_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Search2	tst	Flame_Used(a1)
		bne	.Used2
		move	#1,Flame_Used(a1)
		movem	d0/d1,Flame_X_Position(a1)
		clr	Flame_Anim(a1)
		move	#3,Flame_Timer(a1)
		moveq	#11,d0
		jsr	TFMX+16
		bra	.Do_Liane
.Used2		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Search2

		;Wenn Boost-Sequenz:
		;-Tren ffnen
		;-Gegner hngen lassen
.Init_Boost	move	#1,Open_Door_But(a6)
		lea	Liane_Struktur,a1
		move	(a1)+,d0
		lea	Gravitation_Tabelle,a2
		moveq	#0,d2
.Hngen_lassen	move	(a2)+,d1
		neg	d1
		move	d1,Liane_Y_Gravitation_Soll(a1)
		cmp	Liane_Y_Gravitation_Ist(a1),d1
		beq	.Ist_Soll_Ok
		moveq	#1,d2
.Ist_Soll_Ok	add	#LIANE_ENTRY_LENGTH,a1
		dbf	d0,.Hngen_lassen
		tst	d2
		bne	.Do_Liane
		move	#2,Gummi_Boost_Flag(a0)
		move	#4*50,Gummi_Exit_Timer(a0)

		;Liane bewegen und Position bertragen
.Do_Liane		bsr	Bewege_Liane
		lea	Liane_Struktur,a0
		add	#LIANE_ENTRY_LENGTH*4+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)

		;Endgegner von Nutz getroffen ???
		movem.l	d0-d7/a0-a5,-(sp)
		lea	Gummi_Struktur,a0
		tst	Gummi_Hit_Timer(a0)
		beq	.Test_Hit
		subq	#1,Gummi_Hit_Timer(a0)
		bra	.Hit_Ok
.Test_Hit		cmp	#500,Bob_Y_Position(a4)
		bhs	.Hit_Ok
		cmp	#HITS_GUMMI,Gummi_Hit_Zhler(a0)
		bhs	.Hit_Ok
		lea	WorkRam,a2
		sub	#64,Bob_X_Position(a4)
		move	#160,Bob_Width(a4)
		move	#50,Bob_Height(a4)
		jsr	KollTopBobTest
		tst	d7
		bmi	.Nutz_No_Koll
		lea	Gummi_Struktur,a0
		clr	Gummi_Grav_Timer(a0)
		move	#1,Gummi_Grav_Flag(a0)
		move	#50*2,Gummi_Hit_Timer(a0)
		addq	#1,Gummi_Hit_Zhler(a0)
		jsr	Make_Bump
		moveq	#9,d0
		jsr	TFMX+16
.Nutz_No_Koll	add	#64,Bob_X_Position(a4)
.Hit_Ok		movem.l	(sp)+,d0-d7/a0-a5

		;Kollision der Objekte
		move	#890,d2
		cmp	Bob_Y_Position(a4),d2
		bhs	.Keine_Kollision
		move	d2,Bob_Y_Position(a4)
		sub	#2000,Liane_Y_Geschwindigkeit(a0)
		moveq	#3,d0
		jsr	TFMX+16

		;Gegner darstellen (>&<)
.Keine_Kollision	lea	Gummi_Struktur,a0
		move	Gummi_Hit_Timer(a0),d0
		beq	.Display_Gegner
		and	#%1,d0
		beq	.Test_Nutz_Hit
.Display_Gegner	moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		move.l	Bob_SigelInfo(a4),a0
		jsr	Show_Simple_Mickey
		add	#64,Bob_X_Position(a4)
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		move.l	Bob_SigelInfo(a4),a0
		jsr	Show_Big_Simple_Object

		;Saugnapf I darstellen
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*0+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Saugnapf_Sigel,a0
		jsr	Show_Simple_Mickey

		;Ringe darstellen
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*1+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Ring_Sigel,a0
		jsr	Show_Simple_Mickey
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*2+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Ring_Sigel,a0
		jsr	Show_Simple_Mickey
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*3+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Ring_Sigel,a0
		jsr	Show_Simple_Mickey
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*5+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Ring_Sigel,a0
		jsr	Show_Simple_Mickey
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*6+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Ring_Sigel,a0
		jsr	Show_Simple_Mickey
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*7+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Ring_Sigel,a0
		jsr	Show_Simple_Mickey

		;Saugnapf II darstellen
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*8+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Saugnapf_Sigel,a0
		jsr	Show_Big_Simple_Object

		;Wurde Nutz vom Gegner getroffen ???
.Test_Nutz_Hit	lea	Gummi_Struktur,a0
		cmp	#HITS_GUMMI,Gummi_Hit_Zhler(a0)
		bhs	.Done
		tst	Gummi_Hit_Timer(a0)
		bne	.Done
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*4+WORD,a1
		movem	Liane_X_Position(a1),d1/d2
		sub	#64,d1
		movem	d1/d2,Bob_X_Position(a4)
		move	#160,Bob_Width(a4)
		move	#55,Bob_Height(a4)
		tst	Gummi_Grav_Flag(a0)
		beq	.Nicht_Gegner
		add	#16,Bob_Height(a4)
.Nicht_Gegner	lea	WorkRam,a2
		moveq	#0,d0
		move.b	TEMET_ANZ_HitPoints(a2),d0
		move	d0,-(sp)
		jsr	Test_TEMET_Hit
		move	(sp)+,d0
		cmp.b	TEMET_ANZ_HitPoints(a2),d0
		bls	.Done
		moveq	#23,d0
		jsr	TFMX+16
.Done		rts

; ==========================================================================
;
; Alle Flammen der Flame-Struktur darstellen
;
; ==========================================================================

		;Alle Flammen darstellen
Display_Flame	moveq	#NUM_GEGNER,d0
		jsr	Suche_Bob_Eintrag
		bmi	.Done
		lea	Gummi_Struktur,a1
		cmp	#2,Gummi_Boost_Flag(a1)
		bne	.No_Swap
		tst	Gummi_Exit_Timer(a1)
		beq	.No_Exit_Timer
		subq	#1,Gummi_Exit_Timer(a1)
		bne	.No_Exit_Timer
		move.b	#1,Finish(a6)
.No_Exit_Timer	lea	Display_Flame,a0
		jsr	Search_Mickey_Main
		cmp	#4,d0
		bne	.No_Swap
		move.l	-LONG(a5),-(sp)
		move.l	a0,-LONG(a5)
		move.l	(sp)+,(a5)
		bra	.Done
.No_Swap		lea	Flame_Struktur,a0
		moveq	#FLAME_MAX-1,d7
.Loop_Flame	tst	Flame_Used(a0)
		beq	.Unused
		movem	Flame_X_Position(a0),d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		movem.l	d7/a0-a1,-(sp)
		cmp	#2,Gummi_Boost_Flag(a1)
		bne	.Normal_Flames
		addq	#1,Flame_Frame(a0)
		and	#%11,Flame_Frame(a0)
		move	Flame_Frame(a0),d7
		add	#08,Bob_X_Position(a4)
		lsr	#1,d7
		bcc	.Expl_Right
		sub	#16,Bob_X_Position(a4)
.Expl_Right	add	#08,Bob_Y_Position(a4)
		lsr	#1,d7
		bcc	.Expl_Down
		sub	#16,Bob_Y_Position(a4)
.Expl_Down	move	Flame_Anim(a0),d7
		lsl	#4,d7
		lea	Expl_Sigel_List,a0
		add	d7,a0
		jsr	Show_Simple_Mickey
		bra	.Ok
.Normal_Flames	eor	#1,Flame_Frame(a0)
		beq	.No_Interlace
		add	#22,Bob_Y_Position(a4)
.No_Interlace	move	Flame_Anim(a0),d7
		lsl	#4,d7
		lea	Flame_Sigel_List,a0
		add	d7,a0
		jsr	Show_Simple_Mickey
.Ok		movem.l	(sp)+,d7/a0-a1
.Unused		add	#FLAME_SIZEOF,a0
		dbf	d7,.Loop_Flame
.Done		rts

; ==========================================================================
;
; Saugnapf positionieren
;
; a0 = Zeiger auf Gummi-Struktur
; a1 = Zeiger auf Saugnapf-Positionen
; a2 = Zeiger auf Liane-Struktur
; a3 = Zeiger auf Work-Ram
; d2 = Offset auf Gummi-Struktur (L/R)
;
; ==========================================================================

		;Verzgerung abwarten
Saugnapf_setzen	tst	Gummi_Boost_Flag(a0)
		bne	.No_Trace
		tst	Gummi_Left_Timer(a0,d2.w)
		bmi	.Move
		subq	#1,Gummi_Left_Timer(a0,d2.w)
		bpl	.Done

		;Timet tracen
		move	Liane_Y_Position(a2),d0
		sub	#64,d0
		sub	TEMET_Y_Position(a3),d0
		move	d0,d1
		bpl	.Abstand_positiv
		neg	d1
.Abstand_positiv	cmp	#48,d1
		bls	.No_Trace
		tst	d0
		bmi	.Go_Down

		;Nutz oben
.Go_Up		move	Liane_Y_Position(a2),d0
		cmp	Gummi_Saug_Min(a0),d0
		bls	.No_Trace
		move	#-1,Gummi_Left_Flag(a0,d2.w)
		bra	.Move

		;Nutz unten
.Go_Down		move	Liane_Y_Position(a2),d0
		cmp	Gummi_Saug_Max(a0),d0
		blo	.Go_Down2
		cmp	#HITS_GUMMI,Gummi_Hit_Zhler(a0)
		blo	.No_Trace
		tst	Gummi_Boost_Flag(a0)
		bne	.No_Trace
		move	#1,Gummi_Boost_Flag(a0)
		bra	.No_Trace
.Go_Down2		move	#1,Gummi_Left_Flag(a0,d2.w)
		bra	.Move

		;Nutz in Range oder Min/Max
.No_Trace		lea	Saugnapf_DelayTab_1,a1
		cmp	#2,Gummi_Hit_Zhler(a0)
		blo	.DelayTab_Ok
		lea	Saugnapf_DelayTab_2,a1
		cmp	#4,Gummi_Hit_Zhler(a0)
		blo	.DelayTab_Ok
		lea	Saugnapf_DelayTab_3,a1
.DelayTab_Ok	add	Gummi_Saug_Offset(a0),a1
		move.b	(a1),d0
		bpl	.Time_Ok
		clr	Gummi_Saug_Offset(a0)
		bra	.No_Trace
.Time_Ok		addq	#BYTE,Gummi_Saug_Offset(a0)
		ext	d0
		move	d0,Gummi_Left_Timer(a0,d2.w)
		tst	Gummi_Left_Flag(a0,d2.w)
		bmi	.Done
		clr	Gummi_Left_Timer(a0,d2.w)
		bra	.Done

		;Saugnapf setzen
.Move		add	Gummi_Left_Offset(a0,d2.w),a1
		cmp.b	#$7f,(a1)
		bne	.No_End
		moveq	#10,d0
		jsr	TFMX+16
		clr	Gummi_Left_Offset(a0,d2.w)
		move	Gummi_Left_Flag(a0,d2.w),d0
		bra	.No_Trace
.No_End		cmp.b	#$7e,(a1)
		bne	.No_Pop
		moveq	#10,d0
		jsr	TFMX+16
		moveq	#2,d0
		bra	.Ok2
.No_Pop		move.b	(a1),d0
		ext	d0
.Ok2		cmp	#Gummi_Left_Timer,d2
		beq	.Add
		sub	d0,Liane_X_Position(a2)
		bra	.Ok
.Add		add	d0,Liane_X_Position(a2)
.Ok		addq	#1,Gummi_Left_Offset(a0,d2.w)
		tst	Gummi_Left_Flag(a0,d2.w)
		bpl	.Down
		subq	#3,Liane_Y_Position(a2)
		bra	.Done
.Down		addq	#3,Liane_Y_Position(a2)
.Done		rts

; ==========================================================================
;
; Show Mickey-Objekt
;
; ==========================================================================

Show_Mickey_Object	moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		move.l	Bob_SigelInfo(a4),a0
		jmp	Show_Simple_Mickey

; ==========================================================================

Show_Mickey_XObject	move	#Tekkno_EnemyVRam/32,d3
		move.l	Bob_SigelInfo(a4),a0
		jmp	Show_Big_Simple_Object

; ==========================================================================
;
; Spezielle Routinen fr die Buttons
;
; ==========================================================================

Init_GlMi_Button	and	#$fff0,Bob_Y_Position(a4)
		add	#6,Bob_Y_Position(a4)
		move.l	#Show_Mickey_Object,Button_Display(a4)
		move.l	#Gl_Button,Bob_Routine(a4)
		move.l	#MiButton_Press_Anim,Button_Work_Anim(a4)
		move.l	#Clear_MiButton_Flag,Button_Out_Rout(a4)
		rts

; ==========================================================================

Init_Button_1	move.l	#Press_Button_1,Button_Routine(a4)
		bra	Init_GlMi_Button
Init_Button_2	move.l	#Press_Button_2,Button_Routine(a4)
		bra	Init_GlMi_Button
Init_Button_3	move.l	#Press_Button_3,Button_Routine(a4)
		bra	Init_GlMi_Button

; ==========================================================================

Press_GlMi_Button	clr.b	Button_Working(a4)
		cmp	#%111,Gummi_Button_Bits(a0)
		bne	.Done
		move	#1,Open_Door_But(a6)
.Done		rts

; ==========================================================================

Press_Button_1	lea	Gummi_Struktur,a0
		or	#%001,Gummi_Button_Bits(a0)
		bra	Press_GlMi_Button
Press_Button_2	lea	Gummi_Struktur,a0
		or	#%010,Gummi_Button_Bits(a0)
		bra	Press_GlMi_Button
Press_Button_3	lea	Gummi_Struktur,a0
		or	#%100,Gummi_Button_Bits(a0)
		bra	Press_GlMi_Button

; ==========================================================================

Clear_MiButton_Flag
		lea	Gummi_Struktur,a0
		clr	Gummi_Button_Bits(a0)
		clr	Open_Door_But(a6)
		rts

; ==========================================================================
Mickey_DoorAnimTab	dc.l	Door_Anim_Norm,Door_Anim_Small,0
			dc.w	Tekkno_EnemyVRam/32

; ==========================================================================

Door_Init	move.l	#Mickey_DoorAnimTab,Door_Anims(a4)
		move.l	#Test_Init_Doors,Bob_Routine(a4)
		move.l	#Show_Mickey_Object,Door_Show_Rout(a4)
		rts

; ==========================================================================

		ENDC

;SOURCEEND